Python 文件操作详解
在 Python 编程中,文件操作是日常开发中最常用的功能之一。本文将对文件的打开、关闭、读写模式、路径处理以及数据序列化等核心知识进行系统梳理。
一、文件的打开和关闭
1. open() 函数
open() 是 Python 内置函数,底层调用操作系统接口。返回的文件对象通常称为文件句柄(如 f, fh),所有文件操作需通过该句柄的方法完成。
# 基本用法
f = open(r'd:\测试文件.txt', mode='r', encoding='utf-8')
content = f.read()
print(content)
f.close()
参数说明:
encoding: 指定编码格式。若不写,默认使用操作系统编码(Windows 通常为 GBK,Linux/Mac 为 UTF-8)。mode: 指定访问模式,默认为'r'(只读)。
2. with 上下文管理器
推荐使用 with open() 语句,它能自动管理资源,无需手动调用 close(),且支持同时操作多个文件。
# 优点 1:自动关闭文件
with open('文件操作的读', encoding='utf-8') as f:
print(f.read())
# 优点 2:同时操作多个文件
with open('read.txt', encoding='utf-8') as f1, \
open('write.txt', encoding='utf-8', mode='w') as f2:
content = f1.read()
f2.write(content)
3. 路径管理
- 绝对路径:完整描述目标位置,如
C:/Users/...。 - 相对路径:基于当前工作目录。
test.txt:当前文件夹。../test.txt:上一级文件夹。demo/test.txt:当前文件夹下的子目录。
路径书写建议:
- 使用正斜杠
/(推荐),跨平台兼容性好。 - 或使用原始字符串
r''避免转义问题。 - 现代 Python 开发推荐使用
pathlib模块处理路径。
from pathlib import Path
p = Path('data/file.txt')
if p.exists():
print(p.read_text(encoding='utf-8'))
二、常用文件访问模式
| 模式 | 说明 |
|---|---|
r | 只读(默认),文件不存在则报错 |
w | 只写,文件不存在则创建,存在则清空 |
a | 追加写,文件不存在则创建,存在则追加内容 |
b | 二进制模式(需配合 r/w/a 使用) |
+ | 读写模式(如 r+, w+, a+) |
注意:
- 文本模式 (
r) 下读取的是字符串,二进制模式 (rb) 下读取的是字节串。 r+模式下,文件指针默认在开头。若先写后读,写入内容可能覆盖原有数据。
三、文件的读取和写入
1. 读取方法
假设文件内容为多行文本:
# read():一次性读取全部
f = open('test.txt', encoding='utf-8')
print(f.read())
f.close()
# read(n):读取 n 个字符或字节
f = open('test.txt', encoding='utf-8')
print(f.read(6)) # 读取前 6 个字符
f.close()
# readline():读取一行
f = open('test.txt', encoding='utf-8')
print(f.readline().strip())
f.close()
# readlines():读取所有行为列表(大文件慎用)
f = open('test.txt', encoding='utf-8')
lines = f.readlines()
print(lines)
f.close()
# for 循环迭代(推荐,节省内存)
with open('test.txt', encoding='utf-8') as f:
for line in f:
print(line.strip())
2. 写入方法
write():写入字符串或字节。w模式会清空原文件内容。
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('Hello World\n')
3. 指针定位
tell():获取当前文件指针位置。seek(offset, whence):移动指针。whence=0:从文件头开始。whence=1:从当前位置开始。whence=2:从文件末尾开始。
with open('test.txt', 'rb') as f:
f.seek(5, 0) # 从开头跳过 5 字节
data = f.read()
四、文件拷贝功能
实现文件拷贝时,建议使用二进制模式以兼容所有文件类型(包括图片、视频等)。
import os
def copy_file(src_path, dst_path):
if not os.path.isfile(src_path):
raise FileNotFoundError(f"源文件 {src_path} 不存在")
try:
with open(src_path, 'rb') as src, open(dst_path, 'wb') as dst:
while True:
chunk = src.read(1024 * 1024) # 每次读取 1MB
if not chunk:
break
dst.write(chunk)
print("拷贝成功")
except Exception as e:
print(f"发生错误:{e}")
五、CSV 文件的读写
CSV (Comma-Separated Values) 是以纯文本形式存储表格数据,单元格间用逗号分隔。
import csv
# 写入 CSV
with open('data.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['name', 'age', 'score'])
writer.writerows([
['zhangsan', 18, 98],
['lisi', 20, 99]
])
# 读取 CSV
with open('data.csv', 'r', encoding='utf-8-sig') as f:
reader = csv.reader(f)
for row in reader:
print(row)
*注:newline='' 可防止 Windows 下出现多余空行,utf-8-sig 支持 Excel 打开中文不乱码。
六、内存中的文件操作
Python 提供 StringIO 和 BytesIO 类,将内存缓冲区当作文件对象操作。
from io import StringIO, BytesIO
# 字符串缓冲
sio = StringIO()
sio.write('hello\n')
sio.write('world')
print(sio.getvalue())
# 字节缓冲
bio = BytesIO()
bio.write('你好'.encode('utf-8'))
print(bio.getvalue())
七、sys 模块重定向
通过修改 sys.stdin、sys.stdout、sys.stderr 可实现输入输出流的控制。
import sys
# 重定向标准输出到文件
with open('log.txt', 'w', encoding='utf-8') as f:
old_stdout = sys.stdout
sys.stdout = f
print('This goes to file')
sys.stdout = old_stdout
八、序列化和反序列化
当需要保存复杂对象(如列表、字典、自定义类实例)时,需进行序列化。
1. JSON 模块
适用于跨语言、跨平台的数据交换,仅支持基础数据类型。
import json
# 序列化
data = {'name': 'Alice', 'age': 25}
json_str = json.dumps(data, ensure_ascii=False)
# 反序列化
obj = json.loads(json_str)
# 直接读写文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
2. Pickle 模块
适用于 Python 内部数据持久化,支持任意 Python 对象,但不可跨语言。
import pickle
# 序列化并保存
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 加载
with open('data.pkl', 'rb') as f:
loaded_data = pickle.load(f)
3. JSON 与 Pickle 对比
- JSON:文本格式,人类可读,跨平台,不支持自定义对象。
- Pickle:二进制格式,不可读,仅限 Python,支持复杂对象。
九、最佳实践与注意事项
- 异常处理:文件操作易受 IO 错误影响,建议使用
try-except-finally或with语句确保资源释放。 - 编码统一:尽量统一使用
UTF-8编码,避免在不同操作系统间传输时出现乱码。 - 大文件处理:避免使用
readlines()读取超大文件,应采用迭代器逐行处理。 - 权限检查:操作前检查文件是否存在及是否有读写权限。
通过以上方法,可以高效、安全地处理 Python 中的各类文件操作需求。

