Python IO - 操作
Python IO - 操作
1. 输出 print
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
参数:
objects
输出对象。输出多个对象时,需要用,
分隔。sep
默认为空格;多个对象的间隔end
默认为换行符\n
;输出的结尾file
要写入的文件对象flush
bool 类型;是否被缓存通常决定于file
。- 如果
flush=True
,流会被强制刷新。具体来说,每次执行的print
都会写入并刷新file
的内容 - 如果
flush=False
,只有在f.close()
执行后,print
的内容才会写入file
- 如果
实例:
# Example 1
print("good", "morning", sep="-")
# Output: good-morning
# Example 2: Loading 效果
import time
print("Loading", end="")
for i in range(20):
print(".", end="", flush=True)
time.sleep(0.5)
# Output: Loading....................
2. pprint
库,美化输出
方式 1:直接使用函数方法:
# Print object
pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False)
# 返回一个格式化的字符串,不会 print,
pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False)
方式 2:使用类方方式:
pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False)
PrettyPrinter.pprint(object)
PrettyPrinter.pformat(object)
主要参数:
stream
:输出流,默认是sys.stdout
,也就是屏幕输出。indent
:缩进空格数。width
:每行最大宽度,默认为 80 个字符。超过宽度会换行,但如果单个对象超过不会被换行,比如一段长字符串。depth
:限制数据的层级,设置后可以限制过多的嵌套。compact
:若设为 True ,则输出会在接近width
限制才进行换行。
实例:
import pprint
info = {'class': [{'name': 'ZM', 'grades': [90, 91]},
{'name': 'XX', 'grades': [85, 87]} ] }
# print 方法
print(info)
# Output: {'class': [{'name': 'ZM', 'grades': [90, 91]}, {'name': 'XX', 'grades': [85, 87]}]}
# 方式 1:
pprint.pprint(info)
info_p = pprint.pformat(info) # 获取美化的字符串
# 方式 2:
pp = pprint.PrettyPrinter()
pp.pprint(info)
info_p = pp.pformat(info) # 获取美化的字符串
# Output: {'class': [{'grades': [90, 91], 'name': 'ZM'},
# Output: {'grades': [85, 87], 'name': 'XX'}]}
2.1 第三方库 beeprint
beeprint:对 print 内容进一步美化,Github
3. 第三方库 PrettyTable
美化表格输出
参考资料
PrettyTable 教程, site
4. 读写文件
open(file, mode='r', encoding=None)
主要参数:
file
:文件路径mode
:读写模型encoding
:编码格式
mode
读写模式含义,具体参考 website:
- 总结:
r
表示读;w
表示覆盖写入;b
表示二进制模式;a
表示文件末尾追加写入;+
可读可写 r
,rb
:只读;文本模式,二进制模式r+
,rb+
:读写;文本模式,二进制模式w
,wb
:只写;文本模式,二进制模式。如果文件存在,则覆盖;如果文件不存在,则新建。w+
,wb+
:读写;文本模式,二进制模式a
,ab
:追加只写,文本模式,二进制模式。如果文件存在,则覆盖;如果文件不存在,则新建。a+
,ab+
:追加读写,文本模式,二进制模式
主要函数:
file.read([size])
:返回 str 类型;默认读取所有
- 读取指定的
size
字符数(对于二进制模型,size
表示字节数)。
file.readline([size])
:返回 str 类型;默认读取一整行。
- 读取一行的前
size
字符数,最多为一行,包括换行\n
字符
file.readlines([sizeint])
:返回 list 类型,每个元素为一行内容,包括换行 \n
字符;默认读取所有行数
- 读取
sizeint
字符数的行数
file.write(str)
:返回的写入的字符长度
- 将字符串写入文件,如果需要换行,则需要在元素后添加换行
\n
符号
file.writelines(sequence)
:无返回值,
- 将一个序列(list 类型,或 tuple 类型)字符串写入文件。如果需要换行,则需要自行在每个元素后添加换行
\n
符号
file.flush()
:
- 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件
注意:
- 上述函数不会自行处理换行符
\n
:读取一行的时候,最后一个字符为换行符;写入一行的时候,需要自行添加换行符。
实例:两种等价的文件读写方式
# 方式一:推荐方式
with open('test_1.txt', 'w', encoding='utf-8') as f:
f.write('1234567')
# 方式二:
f = open('test_2.txt', 'w', encoding='utf-8')
f.write('1234567')
f.close() # 注意关闭文件
5. 读写压缩文件 zipfile
包
zipfile
库,用于处理压缩包,官方文档
5.1 zipfile.ZipFile()
对象
主要参数:
-
file
:文件路径 -
mode
:操作方式,默认mode='r'
r
:读取,w
:截取,写入a
:追加x
:创建新文件
主要方法:
ZipFile.getinfo(name)
:获取指定文件 name
的信息
ZipFile.infolist()
:获取全部文件的信息
ZipFile.namelist()
:获取全部文件的路径
ZipFile.close()
:关闭文件
ZipFile.setpassword(pwd)
:设置压缩文件密码,执行解压操作需要的密码
ZipFile.extract(member, path=None, pwd=None)
:提取某个文件
- 参数:
member
: str 类型;待解压文件的路径path
:str 类型;本地保存路径pwd
:str 类型;密码
ZipFile.extractall(path=None, members=None, pwd=None)
- 参数:
path
:str 类型;本地保存路径members
: list 类型;待解压文件的路径合集。默认为None
,表示解压全部文件pwd
:str 类型;密码
注意:ZipFile.extract()
和 ZipFile.extractall()
方法,
- 如果保存的路径不存在,会自动创建文件夹
- 如果本地文件存在重名,则会自动覆盖
实例 1:解压文件
import zipfile
# 压缩文件目录
# test/
# test/folder/
# test/folder/test_1.txt
# test/folder/test_2.txt
# test/test.txt
test_file = 'test/test.txt' # 带解压文件
with zipfile.ZipFile('test.zip', 'r') as z:
print(z.infolist())
print(z.namelist())
print(z.getinfo(test_file))
z.extract(test_file, 'extracted_folder') # 单独提取某个文件
z.extractall('extracted_folder') # 提取所有文件
ZipFile.read(name, pwd=None)
:以二进制(byte)的形式读取某个文件
- 如果
name
为文本文件,并且知道编码方式,通过ZipFile.read(name).decode("utf-8")
可以返回文本文件的内容:
ZipFile.open(name, mode='r', pwd=None)
:以二进制(byte)的形式打开某个文件:
- 参数:
mode
:mode='r'
读;mode='w'
写。
实例 2:读取压缩文件中的某个文件
import zipfile
test_file = 'test/test.txt'
with zipfile.ZipFile('test.zip', 'r') as z:
# 方式 1:使用 ZipFile.open()
with z.open(test_file, 'r') as f:
s = f.read() # 读取文件,返回二进制形式
s = s.decode("utf-8") # 二进制形式编码为字符串形式,需要知道文件的编码方式
print(s)
# 方式 2:使用 ZipFile.read()
s = z.read(test_file) # 读取文件,返回二进制形式
s = s.decode("utf-8") # 二进制形式编码为字符串形式,需要知道文件的编码方式
print(s)
def read_csv_from_zip(path):
from io import StringIO
[zip_path, data_path] = path.split('!')
with zipfile.ZipFile(zip_path, 'r') as z:
s = z.read(data_path) # 读取文件,返回二进制形式
s = s.decode("utf-8") # 二进制形式编码为字符串形式,需要知道文件的编码方式
data = pd.read_csv(StringIO(s))
return data
实例 3:压缩文件夹
import os
import zipfile
def file_zip(folder_path, out_file):
"""
压缩指定文件夹
Parameters:
folder_path: 目标文件夹路径
out_file: 压缩文件保存路径 + xxx.zip
Example:
file_zip(folder_path = 'file/data', out_file = 'file/data.zip')
"""
zip = zipfile.ZipFile(out_file, "w", zipfile.ZIP_DEFLATED)
for path, dirnames, filenames in os.walk(folder_path):
fpath = path.replace(folder_path, '')
for filename in filenames:
zip.write(os.path.join(path, filename), os.path.join(fpath, filename))
return None
参考资料
RUNOOB, Python 文件I/O, website