1. r+ 模式
- 读取后指针位置会移动,需要
seek(0)才能重新读取
🤖示例:r+ 的使用:
①. 假设当前目录下有一个 example.txt,内容为 "Hello World"with open('example.txt', 'r+', encoding='utf-8') as f: content = f.read() # 读取全部内容 print(content) # 输出: Hello World f.write(' Python') # 从当前指针位置(文件末尾)写入 # 此时文件内容变为 "Hello World Python"
2. w+ 模式
🌐示例:w+ 的使用:
①. 假设当前目录下有一个 example.txt,内容为 "Hello World"with open('example.txt', 'w+', encoding='utf-8') as f: # 文件内容已被清空 f.write('New content') # 写入新内容 f.seek(0) # 将指针移回开头以便读取 content = f.read() print(content) # 输出: New content
打开后文件内容先被清空,所以写入的内容覆盖了整个文件, 如果不将指针移回开头再次写入内容,将在上次的内容后面继续写入,如果指针移动回开头再写入的话再次写入多少字符就会覆盖内容多少字符,比如连续写入了12345678这些字符,指针移回开头以后再写入abc字符,则原文件内容则变为了abc45678。只有使用
with open('example.txt', 'w+', encoding='utf-8') as f:再次打开文件写入内容时,文件内容才会先清空再写入。
3. 对比总结:
| r+ | w+ |
|---|
| 文件必须存在,否则报FileNotFoundError | |
| | |
| | |
| | |
| | |
4. 与其他模式的简单对比:
r(只读):文件必须存在,不能写入。
w(只写):文件不存在则创建,存在则清空,只能写入不能读取。
a(追加):文件不存在则创建,存在则指针置于末尾,只能写入不能读取。
a+(读写追加):文件不存在则创建,存在则指针置于末尾,可读可写,但写入总是追加到末尾。
5. 常见错误示例(使用w+代替r+):
①. 错误示例:想修改配置文件却清空了所有内容with open('config.ini', 'w+') as f: # 错误!应使用r+ # 试图读取配置 config = f.read() # 修改配置 config = config.replace("old_value", "new_value") # 写回(但因为w+模式,文件已被清空) f.write(config)
结果:config.ini内容被清空,只保留new_value,导致配置丢失。
6. 选择哪种模式?决策流程
7. 注意事项:
使用 + 模式时,读取和写入操作共享同一个文件指针。写入后如需读取,通常需要调用 seek() 调整指针位置。
在 r+ 模式下写入时,如果写入位置在文件中间,会覆盖原有内容(而不是插入),这与普通文本编辑器的行为不同。
如果需要在文件中间插入内容,通常需要读取全部内容到内存,修改后再重新写入整个文件(使用 w 或 w+)。
8. 实际选择建议:
如果需要修改现有文件的部分内容(例如替换某些字符),使用 r+,但要注意指针定位。
如果需要创建一个新文件或完全覆盖旧文件,并在写入后读取验证,使用 w+。
如果只是读取,用 r;如果只是写入新内容(覆盖或追加),用 w 或 a 更简单安全。
9. 常见错误与解决方案:
10. 总结:
r+:保留原文件内容,用于修改已有文件(文件必须存在)
w+:清空文件内容,用于创建新文件或覆盖原文件(文件不存在则创建)
💡 重要提示:在实际生产环境中,切勿在不知道文件状态的情况下使用w+,它会导致数据丢失。在关键操作前,建议添加文件存在性检查:
import osif os.path.exists('config.ini'): with open('config.ini', 'r+') as f: # 修改配置else: # 创建新配置文件