文件处理
shutil 模块
shutil
模块提供了一系列对文件和文件集合的高阶操作。 特别是提供了一些支持文件拷贝和删除的函数。
# 返回值是复制之后的路径
shutil.copy("来源文件", "目标地址")
内置函数open()
基本操作:
- 打开文件,得到文件句柄并赋值给变量
- 通过句柄对文件进行操作
- 关闭文件
f = open("文件名", encoding="utf-8") # 默认系统编码win下GBK
data = f.read()
print(data)
f.close()
可选模式:
只读"r"(默认)
只写"w" 如果文件存在则清空 不存在则新建
可读可写"r+"
追加写入"a"/"a+" 如
f=open("x.txt","a")
f.read() # 连续读字符 默认全部读完
f.readable() # 是否可读
f.readline() # 连续读行
f.readlines() # 用列表返回每一行,成员的换行符不会被忽略
f.write(str) # 连续写 "a"模式在末尾追加
f.writeable() # 是否可写
f.writelines(list) # 将列表连续写行,成员的换行符需要带上,如["aaa\n","bbb\n","ccc\n"]
"b"模式不能设置 encoding;"rb" 读二进制
data = f.read()
print(data.decode("utf-8"))
"wb" 写二进制
f.write(bytes("内容", encoding="utf-8"))
"ab"追加
上下文管理
file 对象实现了魔术方法__enter__()
和__exit__()
所以可以使用 with open(filename) as f:
的写法 无需关闭
其他参数
encoding
规定字符集
file = open(filename, "w", encoding="Latin-1")
newline
规定换行效果,默认适应操作系统
对于用\r\n
换行的系统,默认的newline="\r"
,故而只需要写入"\n"
就相当于写入"\r\n"
另一方面,设置newline=""
才能使用"\r\n"
换行,下面是官方参考手册里的解释:
In Python 2.X, it was required to open the csvfile with 'b' because the csv module does its own line termination handling.
In Python 3.X, the csv module still does its own line termination handling, but still needs to know an encoding for Unicode strings. The correct way to open a csv file for writing is:
pythonoutputfile = open("out.csv", "w", encoding="utf8", newline="")
encoding can be whatever you require, but newline='' suppresses text mode newline handling. On Windows, failing to do this will write \r\r\n file line endings instead of the correct \r\n. This is mentioned in the 3.X csv.reader documentation only, but csv.writer requires it as well.
对于下文即将介绍的 csv 模块也是如此。
其他方法
f.flush()
刷新f.tell()
当前光标所在位置f.seek(int,int默认0)
相对位置读字节- 负数倒着读,只能 b 模式下使用
- 第二个参数:
- 0 代表从文件开头开始算起
- 1 代表从当前位置开始算起
- 2 代表从文件末尾算起
- utf 的 3 字节一个汉字 seek(3)相当于从头开始 read(1)
f.truncate(int)
截取字节
for i in f:
offs = -10
while 1:
f.seek(offs, 2)
data = f.readlines()
if len(data) > 1:
print("最后一行是" + data[-1].decode("utf-8"))
break
offs *= 2
csv 模块
内置模块 读写 csv 表格
读取例子:
import csv
filename = "名单.csv"
with open(filename) as f:
reader = csv.reader(f)
print(list(reader))
如果不用with
需要csvFile.close()
从 Office 导出的 csv 文件需要设置encoding='utf-8-sig'
否则会读出\ufeff
(BOM)
写入例子:
import csv
filename = "单推名单.csv"
with open(filename, "w", encoding="utf-8", newline="") as csvFile:
writer = csv.writer(csvFile)
fileHeader = ("姓名", "年龄")
writer.writerow(fileHeader)
data = ("夏色祭", 17)
writer.writerow(data)
正如前文中的描述,如果不设置newline=''
,将会导致writerow
额外写入空行。
configparser 模块
内置模块 适用于操作配置文件
常见文档格式如下:
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no
生成
import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {
"ServerAliveInterval": "45",
"Compression": "yes",
"CompressionLevel": "9",
"ForwardX11": "yes",
}
config["bitbucket.org"] = {"User": "hg"}
config["topsecret.server.com"] = {"Host Port": "50022", "ForwardX11": "no"}
with open("example.ini", "w") as configfile:
config.write(configfile)
读取
import configparser
config = configparser.ConfigParser()
config.read("example.ini", encoding="utf8")
print(config.sections()) # ['bitbucket.org', 'topsecret.server.com']
print("bytebong.com" in config) # False
print("bitbucket.org" in config) # True
print(config["bitbucket.org"]["user"]) # hg
print(config["DEFAULT"]["Compression"]) # yes
print(config["topsecret.server.com"]["ForwardX11"]) # no
print(config["bitbucket.org"]) # <Section: bitbucket.org>
for key in config["bitbucket.org"]: # 注意,有default会默认default的键
print(key)
config.options("bitbucket.org") # 同for循环,找到'bitbucket.org'下所有键
config.items("bitbucket.org") # 找到'bitbucket.org'下所有键值对
config.get("bitbucket.org", "compression") # 获取'bitbucket.org'下key对应的value
修改
import configparser
config = configparser.ConfigParser()
config.read("example.ini")
# 增加
config.add_section("yuan")
# 删除
config.remove_section("bitbucket.org")
config.remove_option("topsecret.server.com", "forwardx11")
# 修改
config.set("topsecret.server.com", "k1", "11111")
config.set("yuan", "k2", "22222")
# 保存修改
with open("new2.ini", "w") as configfile:
config.write(configfile)
io 模块
io 是更低级的模块,内置的 open 函数足以解决百分之 99 的问题。
最后百分之 1 的需求基本是二进制流的: from io import BytesIO
文件流转为 base64
output_buffer = BytesIO()
image.save(output_buffer, format="JPEG")
byte_data = output_buffer.getvalue()
base64_str = "data:image/jpeg;base64," + base64.b64encode(byte_data).decode("utf8")
base64 模块见加密章节
HTTP 返回文件流
output_buffer = BytesIO()
mid.save(file=output_buffer)
output_buffer.seek(0)
res = StreamingResponse(
output_buffer,
headers={
"content-type": "audio/mid",
"content-disposition": "attachment;filename=output.mid",
},
)