Appearance
20|文件读写
程序需要持久化数据时,文件是最直接的载体。配置文件、日志、数据导出、报告生成——这些场景都离不开文件的读写操作。
一、open() 函数
open() 打开文件,返回文件对象:
python
f = open("data.txt", "r", encoding="utf-8")
content = f.read()
f.close()模式参数:
| 模式 | 含义 |
|---|---|
"r" | 只读(默认) |
"w" | 只写,文件存在则覆盖 |
"a" | 追加,写在文件末尾 |
"x" | 创建新文件,文件已存在则报错 |
"b" | 二进制模式,如 "rb"、"wb" |
"+" | 读写,如 "r+"、"w+" |
二、with 语句
文件打开后必须关闭,释放系统资源。with 语句自动处理关闭:
python
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
# 离开 with 块时,f.close() 自动调用with 保证即使代码块内部抛出异常,文件也会被正确关闭。这是处理文件的标准写法。
三、读取方式
read():读取全部
python
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read() # 读取整个文件为字符串大文件不要用 read()——会把整个文件内容加载到内存。
readline():逐行读取
python
with open("data.txt", "r", encoding="utf-8") as f:
first = f.readline() # 读取一行(包含末尾换行符)
second = f.readline()迭代读取:最常用
python
with open("data.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip()) # strip() 去掉末尾换行符文件对象是可迭代的,每次迭代返回一行。这是处理大文件的最佳方式——内存里始终只有当前行。
readlines():读取为列表
python
with open("data.txt", "r", encoding="utf-8") as f:
lines = f.readlines() # ['第一行\n', '第二行\n', ...]四、写入文件
python
# 覆盖写入
with open("output.txt", "w", encoding="utf-8") as f:
f.write("第一行\n")
f.write("第二行\n")
# 追加写入
with open("log.txt", "a", encoding="utf-8") as f:
f.write("新日志\n")write() 不会自动加换行符,需要手动写 \n。
写入多行:
python
lines = ["line1", "line2", "line3"]
with open("output.txt", "w", encoding="utf-8") as f:
f.write("\n".join(lines))
f.write("\n") # 末尾加换行或:
python
with open("output.txt", "w", encoding="utf-8") as f:
f.writelines(line + "\n" for line in lines)五、二进制文件
图片、音频、压缩包等非文本文件用二进制模式:
python
# 读取二进制
with open("image.png", "rb") as f:
data = f.read() # data 是 bytes 对象
# 写入二进制
with open("copy.png", "wb") as f:
f.write(data)二进制模式不需要指定 encoding。
六、编码问题
文件编码不一致是常见错误:
python
# 文件实际是 GBK 编码,按 UTF-8 读会报错
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read() # UnicodeDecodeError解决:
python
# 尝试不同编码
with open("data.txt", "r", encoding="gbk") as f:
content = f.read()
# 或忽略错误字符
with open("data.txt", "r", encoding="utf-8", errors="ignore") as f:
content = f.read()
# 或用替代字符
with open("data.txt", "r", encoding="utf-8", errors="replace") as f:
content = f.read()Linux 系统默认编码通常是 UTF-8。Windows 上中文系统可能用 GBK,跨平台时要注意。
七、文件指针
文件对象内部有一个指针,标记当前读写位置:
python
with open("data.txt", "r+") as f:
content = f.read() # 指针移到末尾
f.seek(0) # 指针移回开头
f.write("OVERWRITE") # 从开头覆盖写入seek(0) 把指针移到文件开头。日常脚本中很少需要手动操作指针。
记忆锚点:with open(...) as f 是标准写法,自动关闭文件;for line in f 逐行读取,省内存;"r" 读,"w" 覆盖写,"a" 追加;二进制模式用 "rb"/"wb",不要指定编码;编码不一致时尝试 gbk 或加 errors="ignore";write() 不自动加换行符。