

在 Python 编程中,文件操作是数据处理、持久化存储的基础技能。Python 3 提供了丰富的文件操作方法,支持文本与二进制文件的读写、文件指针控制、文件对象管理等功能。本文将深入解析 Python 3 中文件操作的核心方法、使用场景及最佳实践,帮助开发者高效处理各类文件操作需求。
open() 是 Python 操作文件的核心函数,返回一个文件对象:
file = open(file_path, mode='r', encoding=None, errors=None)
关键参数:
file_path:文件路径(绝对或相对路径)mode:打开模式(默认 'r',即只读文本模式)encoding:文件编码(如 'utf-8'、'gbk' 等,默认系统编码)errors:编码错误处理方式(如 'ignore'、'replace' 等)
常用模式:
| 模式 | 描述 | 适用场景 |
|---|
'r' | 只读(默认) | 读取配置文件、文本数据 |
'w' | 写入(覆盖) | 生成报告、保存处理后的数据 |
'a' | 追加 | 日志记录、增量数据存储 |
'rb' | 二进制只读 | 读取图片、视频等二进制文件 |
'wb' | 二进制写入(覆盖) | 保存图片、备份二进制数据 |
文件使用完毕后需调用 close() 释放资源:
file = open('data.txt', 'r')
data = file.read()
file.close()
更安全的做法:使用 with 语句
with 语句会自动管理文件的打开与关闭,避免资源泄漏:
with open('data.txt', 'r') as file:
data = file.read()
with open('image.jpg', 'rb') as f:
data = f.read(1024)
with open('source.jpg', 'rb') as src, open('target.jpg', 'wb') as dst:
while True:
chunk = src.read(4096)
if not chunk:
break
dst.write(chunk)
with open('data.txt', 'r') as f:
print(f.tell())
f.read(10)
print(f.tell())
offset:偏移量(字节数)whence:参考点(0 = 文件开头,1 = 当前位置,2 = 文件末尾)
示例:
with open('data.txt', 'r') as f:
f.seek(5)
f.seek(-3, 2)
f.seek(0)
with open('data.txt', 'r') as f:
print(f.closed)
print(f.closed)
with open('data.txt', 'r') as f:
print(f.readable())
print(f.writable())
with open('output.txt', 'w') as f:
print(f.readable())
print(f.writable())
将缓冲区数据立即写入磁盘(通常用于需要实时更新文件的场景):
with open('log.txt', 'a') as f:
f.write("Logging data...
")
f.flush()
def read_large-file(file_path):
with open(file_path, 'r') as f:
for line in f:
yield line.strip()
for line in read_large-file('large_data.txt'):
process(line)
自定义文件操作类,实现上下文管理协议:
class MyFileHandler:
def __init__(self, file_path, mode):
self.file_path = file_path
self.mode = mode
def __enter__(self):
self.file = open(self.file_path, self.mode)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
self.file.close()
return True
with MyFileHandler('data.txt', 'r') as f:
data = f.read()
- 问题表现:读取文件时出现
UnicodeDecodeError - 解决方案:明确指定文件编码(如
encoding='utf-8'),或使用 errors 参数处理错误
with open('data.txt', 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
- 避免操作:直接调用
read() 读取整个大文件 - 推荐方法:使用迭代器逐行处理,或分块读取(
read(chunk_size))
使用 os.path 或 pathlib 模块处理跨平台路径问题:
from pathlib import Path
file_path = Path('data') / 'subdir' / 'file.txt'
with open(file_path, 'r') as f:
data = f.read()
使用 tempfile 模块创建临时文件,自动管理生命周期:
import tempfile
with tempfile.TemporaryFile('w+b') as f:
f.write(b"Test data")
f.seek(0)
print(f.read())
| 方法 | 功能描述 | 返回值类型 | 适用场景 |
|---|
read(size=-1) | 读取指定字节数的内容 | 字符串(文本模式)或字节(二进制模式) | 小文件读取、快速数据获取 |
readline() | 读取一行内容 | 字符串或字节 | 配置文件解析、逐行处理 |
readlines() | 读取所有行,返回列表 | 字符串列表或字节列表 | 中等大小文件的批量处理 |
write(string) | 写入字符串或字节 | 写入的字符数或字节数 | 数据持久化存储 |
writelines(lines) | 写入多行内容 | 无 | 批量写入多行数据 |
seek(offset, whence) | 移动文件指针 | 当前位置 | 随机访问文件特定位置 |
tell() | 获取当前文件指针位置 | 整数(字节偏移量) | 记录或恢复读取位置 |
flush() | 强制刷新缓冲区到磁盘 | 无 | 实时日志记录、数据同步 |
通过掌握上述文件操作方法和最佳实践,开发者可以高效、安全地处理各类文件场景,从简单的配置文件读取到复杂的大数据流处理,均能应对自如
