以下是 Python open() 函数所有文件模式的完整总结表,涵盖读、写、覆盖、追加行为和适用场景:
| 模式 | 读 | 写 | 覆盖(清空) | 追加 | 二进制 | 适用场景 |
|---|---|---|---|---|---|---|
r |
✔️ | ❌ | ❌ | ❌ | ❌ | 只读现有文件。 |
r+ |
✔️ | ✔️ | 局部覆盖 | ❌ | ❌ | 读写现有文件,可修改任意位置的内容(不自动清空文件)。 |
w |
❌ | ✔️ | 全部覆盖 | ❌ | ❌ | 创建新文件或清空并写入旧文件。 |
w+ |
✔️ | ✔️ | 全部覆盖 | ❌ | ❌ | 读写模式,清空文件后从头写入(适合完全重写内容并读取)。 |
a |
❌ | ✔️ | ❌ | ✔️ | ❌ | 追加写入,文件不存在则创建。 |
a+ |
✔️ | ✔️ | ❌ | ✔️ | ❌ | 追加写入并支持读取历史数据(需手动移动指针)。 |
x |
❌ | ✔️ | ❌ | ❌ | ❌ | 独占创建新文件,若文件已存在则报错。 |
rb |
✔️ | ❌ | ❌ | ❌ | ✔️ | 以二进制模式只读现有文件(如图片、音频等)。 |
rb+ |
✔️ | ✔️ | 局部覆盖 | ❌ | ✔️ | 二进制读写现有文件,可修改任意位置的内容。 |
wb |
❌ | ✔️ | 全部覆盖 | ❌ | ✔️ | 二进制模式覆盖写入或创建新文件(如写入二进制数据)。 |
wb+ |
✔️ | ✔️ | 全部覆盖 | ❌ | ✔️ | 二进制读写模式,清空文件后从头写入(适合完全重写二进制数据并读取)。 |
ab |
❌ | ✔️ | ❌ | ✔️ | ✔️ | 二进制模式追加写入(如日志文件追加二进制数据)。 |
ab+ |
✔️ | ✔️ | ❌ | ✔️ | ✔️ | 二进制模式追加写入并支持读取历史数据(需移动指针)。 |
xb |
❌ | ✔️ | ❌ | ❌ | ✔️ | 二进制模式独占创建新文件,若文件存在则报错。 |
关键说明
-
覆盖(清空) :
-
w/w+/wb/wb+:打开文件时立即清空内容。 -
r+/rb+:写入时仅覆盖当前指针位置的数据(需手动控制)。 -
a/a+/ab/ab+:始终追加写入,不覆盖原有内容。
-
-
追加:
-
a/a+/ab/ab+:写入内容始终追加到文件末尾,即使手动移动指针也会强制回到末尾。
-
-
二进制模式:
- 带
b的模式(如rb、wb+)用于处理二进制数据(非文本文件)。 - 不带
b的默认模式是文本模式(自动处理编码,如utf-8)。
- 带
-
适用场景:
-
r+/rb+:修改文件中间部分(如配置文件更新)。 -
w+/wb+:完全重写文件内容(如生成新数据并需要读取)。 -
a+/ab+:日志文件追加(同时支持读取历史记录)。 -
x/xb:确保文件不存在时安全创建(避免意外覆盖)。
-
示例代码
1. r+ 模式(修改文件局部内容)
with open("data.txt", "r+") as f:
f.seek(5) # 移动到第5字节
f.write("Python") # 覆盖从第5字节开始的内容
2. a+ 模式(追加并读取历史内容)
with open("log.txt", "a+") as f:
f.write("New log entry\n")
f.seek(0) # 移动指针到开头
print(f.read()) # 读取全部日志内容
3. wb+ 模式(读写二进制文件)
with open("image.png", "wb+") as f:
f.write(b"\x89PNG\x0D\x0A\x1A\x0A") # 写入PNG文件头
f.seek(0)
header = f.read(8) # 读取文件头验证
print(header) # 输出: b'\x89PNG\r\n\x1a\n'
注意事项
-
w/w+会清空文件:使用前确认文件内容无需保留。 -
指针控制:读写混合操作时,用
seek()精确控制指针位置。 -
文件编码:文本模式需指定
encoding参数(如open("file.txt", "r", encoding="utf-8"))。 -
异常处理:
x/xb模式需捕获FileExistsError异常。
根据需求选择合适模式,避免数据丢失或逻辑错误! 🚀