Python 文件操作详解
在 Python 编程中,文件操作是处理数据持久化的基础。本文系统梳理了文件的打开、关闭、读写模式、路径管理、序列化以及异常处理等核心知识。
Python 中的文件操作技术,涵盖文件打开关闭机制、路径管理、读写模式选择、指针定位及文件拷贝实现。内容包含 CSV 数据处理、内存 IO 缓冲类(StringIO/BytesIO)的使用,以及 sys 模块的标准 IO 重定向。重点讲解了 JSON 与 Pickle 两种序列化方案的区别与应用场景,并补充了异常处理机制与生产环境下的最佳实践建议,帮助开发者构建稳健的数据持久化方案。

在 Python 编程中,文件操作是处理数据持久化的基础。本文系统梳理了文件的打开、关闭、读写模式、路径管理、序列化以及异常处理等核心知识。
open() 是内置函数,底层调用操作系统接口。返回的文件对象通常称为文件句柄(如 f1, fh),所有文件操作需通过句柄的方法进行。
# 基本用法
f1 = open(r'd:\测试文件.txt', mode='r', encoding='utf-8')
content = f1.read()
print(content)
f1.close()
参数说明:
encoding: 指定编码格式。若不写,默认使用操作系统编码(Windows 通常为 GBK,Linux/Mac 为 UTF-8)。mode: 指定访问模式,默认为 'r'(只读)。推荐使用 with open() 语句,它能在代码块执行完毕后自动关闭文件,即使发生异常也能确保资源释放。
# 优点 1:自动关闭文件句柄
with open('文件操作的读', encoding='utf-8') as f1:
print(f1.read())
# 优点 2:同时操作多个文件
with open('read.txt', encoding='utf-8') as f1, \
open('write.txt', encoding='utf-8', mode='w') as f2:
print(f1.read())
f2.write('hahaha')
C:/Users/chris/...。test.txt:当前文件夹查找。./test.txt:显式指定当前文件夹。../test.txt:上级文件夹查找。demo/test.txt:子文件夹查找。路径书写建议:推荐使用正斜杠 / 或原始字符串 r'' 避免转义问题。
file = open('C:/Users/chris/Desktop/xxx.txt')
r:只读(文件必须存在)。w:只写(不存在则创建,存在则清空)。a:追加写(不存在则创建,存在则追加)。非文本文件(如图片)需使用 b 模式,读取内容为字节类型,不可指定编码。
rb, wb, abr+:读写,指针在开头。w+:写读,先清空再读写。a+:写读,指针在末尾。注意:r+ 模式下若先写后读,写入内容可能覆盖后续原有内容,因为光标默认在文件头。
假设文件 data.txt 包含多行文本:
# read(): 全部读取
with open('data.txt', encoding='utf-8') as f:
content = f.read()
# read(n): 按字符或字节读取
with open('data.txt', encoding='utf-8') as f:
print(f.read(6)) # 读取前 6 个字符
# readline(): 读取一行
with open('data.txt', encoding='utf-8') as f:
print(f.readline().strip())
# readlines(): 读取所有行为列表(大文件慎用,占内存)
with open('data.txt', encoding='utf-8') as f:
lines = f.readlines()
# for 循环:迭代器方式,最节省内存
with open('data.txt', encoding='utf-8') as f:
for line in f:
print(line.strip())
# w 模式:清空并写入
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('lucy 真帅')
# wb 模式:二进制写入(如复制图片)
with open('image.png', 'rb') as src:
data = src.read()
with open('copy.png', 'wb') as dst:
dst.write(data)
tell():返回当前指针位置。seek(offset, whence):移动指针。
whence=0:从文件头开始。whence=1:从当前位置开始。whence=2:从文件末尾开始。with open('test.bin', 'rb') as f:
f.seek(2, 0) # 从开头跳过 2 字节
print(f.read())
使用二进制流逐块读取写入,适合大文件。
import os
file_name = input('请输入文件路径:')
if os.path.isfile(file_name):
old_file = open(file_name, 'rb')
names = os.path.splitext(file_name)
new_file_name = names[0] + '.bak' + names[1]
new_file = open(new_file_name, 'wb')
while True:
content = old_file.read(1024)
if not content:
break
new_file.write(content)
new_file.close()
old_file.close()
else:
print('文件不存在')
CSV 是以逗号分隔的纯文本表格数据。Python 提供 csv 模块。
import csv
with open('test.csv', 'w', newline='', encoding='utf-8-sig') as file:
writer = csv.writer(file)
writer.writerow(['name', 'age', 'score'])
writer.writerows([['zhangsan', '18', '98'], ['lisi', '20', '99']])
*注:newline='' 防止 Windows 下出现空行。
import csv
with open('test.csv', 'r', encoding='utf-8-sig') as file:
reader = csv.reader(file)
for row in reader:
print(row)
将数据暂存于内存缓冲区,类似文件操作。
用于字符串。
from io import StringIO
f = StringIO()
f.write('hello\n')
print(f.getvalue()) # 获取内容
f.close()
用于二进制数据。
from io import BytesIO
f = BytesIO()
f.write('你好'.encode('utf-8'))
print(f.getvalue())
f.close()
sys.stdin:标准输入(键盘)。sys.stdout:标准输出(控制台)。sys.stderr:错误输出。可重定向这些流到文件。
import sys
m = open('stdout.txt', 'w', encoding='utf-8')
sys.stdout = m
print('重定向输出')
m.close()
对象无法直接写入文件,需转换为字符串或二进制。
适用于跨平台、跨语言的数据交换,仅支持基本数据类型。
dumps/dump:序列化。loads/load:反序列化。import json
data = {'name': 'Alice', 'age': 25}
json_str = json.dumps(data, ensure_ascii=False)
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False)
适用于 Python 内部任意对象的持久化,生成二进制,不跨语言。
wb/rb) 打开文件。import pickle
data = [1, 2, 3]
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
with open('data.pkl', 'rb') as f:
loaded_data = pickle.load(f)
| 特性 | JSON | Pickle |
|---|---|---|
| 格式 | 文本 (字符串) | 二进制 |
| 跨语言 | 支持 | 不支持 |
| 安全性 | 高 | 低 (反序列化可能执行恶意代码) |
| 适用场景 | 配置、API 交互 | Python 对象保存 |
文件操作常涉及 IO 错误,应使用 try-except-finally 或 with 语句确保资源安全。
import os
filename = 'target.txt'
try:
with open(filename, 'r', encoding='utf-8') as f:
content = f.read()
except FileNotFoundError:
print(f'{filename} 不存在')
except PermissionError:
print('无权限访问')
except UnicodeDecodeError:
print('编码错误,尝试其他编码')
finally:
# 无论是否异常,此处可执行清理逻辑
pass
最佳实践总结:
with open() 管理文件生命周期。encoding,避免依赖系统默认值导致乱码。readlines(),改用迭代器。pickle 加密或 JSON 脱敏。os.path 或 pathlib 保证跨平台兼容性。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online