Python 文件操作完全指南
Python 通过内置的 open() 函数和文件对象提供丰富的文件操作能力。下面系统介绍常用操作。
1. 打开文件:open()
f = open('test.txt', 'r') # 模式 'r' 表示只读
常用模式:
| 模式 | 说明 | 文件指针位置 |
|---|---|---|
'r' | 只读(默认) | 文件开头 |
'w' | 写入(会覆盖或创建文件) | 文件开头(清空原内容) |
'x' | 独占创建,文件已存在则报错 | 文件开头 |
'a' | 追加(文件末尾添加) | 文件末尾 |
'b' | 二进制模式(与 r/w/a 组合,如 'rb') | 取决于组合 |
't' | 文本模式(默认) | 取决于组合 |
'+' | 读写模式(如 'r+'、'w+') | 取决于前缀 |
示例:
f = open('data.bin', 'wb') # 二进制写入
f = open('log.txt', 'a') # 追加文本
f = open('file.txt', 'r+') # 读写
2. 推荐方式:使用 with 上下文管理器
with 自动关闭文件,即使发生异常也能正确释放资源。
with open('test.txt', 'r') as f:
content = f.read()
# 离开 with 块后,f 已被自动关闭
3. 读取文件
| 方法 | 说明 |
|---|---|
read(size=-1) | 读取最多 size 个字符(文本模式)或字节(二进制模式),默认全部 |
readline() | 读取一行(包括换行符),文件末尾返回空字符串 |
readlines() | 读取所有行,返回字符串列表 |
| 直接迭代文件对象 | for line in f: 逐行读取,内存高效 |
with open('test.txt') as f:
data = f.read() # 一次性读取全部
with open('test.txt') as f:
for line in f: # 逐行迭代,适合大文件
print(line.strip())
4. 写入文件
| 方法 | 说明 |
|---|---|
write(s) | 写入字符串 s,返回写入的字符数 |
writelines(lines) | 写入字符串列表(不会自动添加换行符) |
with open('output.txt', 'w') as f:
f.write("Hello\n")
f.writelines(["line1\n", "line2\n"])
注意:'w' 模式会清空原文件;如需追加,使用 'a' 模式。
5. 文件指针操作
| 方法 | 说明 |
|---|---|
tell() | 返回当前文件指针位置(字节数,二进制模式;文本模式下可能不准确,取决于编码) |
seek(offset, whence=0) | 移动指针:whence=0 文件开头偏移;1 当前位置;2 文件末尾 |
with open('data.bin', 'rb') as f:
print(f.tell()) # 0
f.seek(10) # 跳到第10字节
data = f.read(5) # 读取5字节
6. 其他常用属性和方法
f.closed:文件是否已关闭。f.name:文件名。f.mode:打开模式。f.flush():将缓冲区内容强制写入磁盘。f.close():关闭文件(通常用with避免手动调用)。
7. 二进制文件操作
读取图片、音频等需用二进制模式 'rb'、'wb'。
with open('image.jpg', 'rb') as f:
img_data = f.read()
with open('copy.jpg', 'wb') as f:
f.write(img_data)
8. 常见编码处理
文本模式默认使用平台编码(如 Windows 的 GBK),建议显式指定 encoding:
with open('utf8.txt', 'r', encoding='utf-8') as f:
content = f.read()
9. 异常处理
try:
with open('not_exist.txt') as f:
data = f.read()
except FileNotFoundError:
print("文件不存在")
except PermissionError:
print("权限不足")
10. 实用示例
逐行处理大文件
with open('large.log') as f:
for line in f:
if 'ERROR' in line:
print(line)
复制文件
with open('src.bin', 'rb') as src, open('dst.bin', 'wb') as dst:
dst.write(src.read())
统计行数
with open('file.txt') as f:
line_count = sum(1 for _ in f)
总结
- 用
open()打开文件,务必使用with确保正确关闭。 - 根据需求选择合适的模式(文本/二进制、读/写/追加)。
- 大文件应逐行迭代,避免一次性
read()导致内存溢出。 - 处理文本文件时明确指定
encoding参数。 更高级的操作(如临时文件、文件锁、内存映射),如tempfile、fcntl、mmap等模块。