当前位置:首页>python>从零开始学python-文件读写r+和w+区别

从零开始学python-文件读写r+和w+区别

  • 2026-10-07 09:10:21
从零开始学python-文件读写r+和w+区别

Hi~新朋友,记得点上面蓝字(网虫root)关注哟~

前言:

r+和w+都是用于读写文件的模式(即允许同时读取和写入)。但它们在打开文件时的行为有重要区别,主要体现在对文件存在性和是否清空文件内容的处理上。

1. r+ 模式

  • 含义:以读写模式打开文件

  • 文件必须存在:如果文件不存在,会抛出 FileNotFoundError

  • 不会清空文件:打开后,文件原有内容保留,写入操作从当前指针位置开始

  • 文件指针位置:位于文件开头

  • 读取后指针位置会移动,需要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"
  • 因为读取操作后,指针移到了文件末尾,所以写入的内容追加到了末尾。

  • 如果想在文件开头覆盖写入,需要使用 f.seek(0) 将指针移回开头,然后再读取修改后的内容

2. w+ 模式

  • 含义:以读写模式打开文件。

  • 文件不存在则创建:如果文件不存在,会创建一个新文件。

  • 清空文件:如果文件已存在,打开时会立即清空文件内容(相当于截断为0字节),从头开始写入

  • 文件指针位置:位于文件开头(但文件是空的)

  • 写入后指针在文件末尾,需要seek(0)才能读取

🌐示例: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
文件不存在则自动创建,存在则清空内容
文件内容处理
保留原有内容
清空原有内容(覆盖)
初始文件指针位置
文件开头(0)
文件开头(0)
适用场景
修改已有文件内容
创建新文件或覆盖文件内容
写入后读取
可直接读取(指针在写入位置)
需要seek(0)移动指针才能读取刚写入的内容

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 更简单安全。

  • 日志追加 → 不要用r+或w+,用a+

9. 常见错误与解决方案:

错误
原因
解决方案
FileNotFoundError
使用r+但文件不存在
检查文件是否存在,或改用w+
写入后读取不到内容
在w+中未使用seek(0)
添加f.seek(0)再读取
意外清空文件
误用w+代替r+
确认操作目的,选择正确模式
读取不到原内容
在r+中未正确移动指针
使用seek(0)重置指针

10. 总结:

r+:保留原文件内容,用于修改已有文件(文件必须存在)

w+:清空文件内容,用于创建新文件或覆盖原文件(文件不存在则创建)

💡 重要提示:在实际生产环境中,切勿在不知道文件状态的情况下使用w+,它会导致数据丢失。在关键操作前,建议添加文件存在性检查:

import osif os.path.exists('config.ini'):    with open('config.ini', 'r+') as f:        # 修改配置else:    # 创建新配置文件

【微语】成长很大一部分是接受,接受分道扬镳,接受世事无常,接受孤独挫败,接受突如其来的无力感,接受自己的不完美。

网虫root

期待你的

分享

点赞

在看

最新文章

随机文章