当前位置:首页>python>搞懂 Python open() 所有文件打开模式,从此读写不翻车

搞懂 Python open() 所有文件打开模式,从此读写不翻车

  • 2026-09-07 18:58:48
搞懂 Python open() 所有文件打开模式,从此读写不翻车

VibeCodingAI围壁扣顶,学习Python从实践到慢慢入门,筑起你的Python知识大厦!知识就是力量,知识改变命运;科技就是生产力,AI就是即战力!

知道程序员为什么叫作码农吗?因为学习写代码就好像种田一样,都是从实践到慢慢入门的一个过程。来吧,跟我一起学习Python从实践到慢慢入门吧!

写 Python 代码,几乎没人能绕开 open() 函数。

读取配置、保存日志、导出数据、读写文本……所有文件操作的起点,都是这句 open()。

但很多人只会用 r、w,对 a、r+、w+、a+、b 模式一知半解。

也正因如此,经常遇到这些诡异问题:

  • 代码没报错,原有文件内容直接被清空;

  • 明明写了写入代码,文件里却空空如也;

  • 想要追加内容,结果覆盖了旧数据;

  • 读取二进制文件乱码、图片/音频打开损坏。

其实 99% 的文件读写 Bug,根源都是 mode 模式选错了。

今天这篇文章,一次性讲透 Python open() 全部打开模式,拆解权限、指针、文件创建规则,附可直接运行的代码案例,新手也能彻底吃透。


一、先搞懂:mode 模式的核心逻辑

open 函数标准语法:

open(file, mode='r', encoding=None)

mode 由两类字符组合而成,各司其职:

1. 读写权限字符(核心)

  • r:只读 read

  • w:只写 write

  • a:追加 append

  • +:在原有权限基础上,新增对立权限(读变读写、写变读写)

2. 文件格式字符

  • t:文本模式 text(默认可省略),处理 txt、md、py 等文本文件,带编码

  • b:二进制模式 binary,处理图片、音频、视频、压缩包,无编码

所有复杂模式,都是这几个字符的排列组合。理解底层规则,比死记硬背更重要。


二、基础 6 种核心模式(必掌握)

1. r / rt 只读模式(默认模式)

规则:

  • 只读不可写,文件指针在文件开头

  • 文件不存在则报错 FileNotFoundError

  • 不会修改、清空原有内容,安全读文件

适用场景:纯读取已有文本文件,最安全的文件读模式。

# 只读模式,文件不存在直接报错with open("test.txt", "r", encoding="utf-8") as f:    text = f.read()print(text)

2. w / wt 清空写入模式

规则:

  • 只写不可读

  • 文件存在:直接清空原有内容,从头写入

  • 文件不存在:自动创建新文件

高危提醒:w 模式会强制清空旧内容,误操作会导致数据丢失!

适用场景:新建文件、覆盖更新文件内容。

# 清空原有内容,写入新文本with open("test.txt", "w", encoding="utf-8") as f:    f.write("新的内容")

3. a / at 追加写入模式

规则:

  • 只写不可读,文件指针在文件末尾

  • 文件存在:保留原有内容,在末尾追加新内容

  • 文件不存在:自动创建新文件

适用场景:日志记录、持续累加保存数据,绝对不会覆盖旧内容。

# 在文件末尾追加内容with open("log.txt", "a", encoding="utf-8") as f:    f.write("\n新增日志记录")

4. rb 二进制只读

纯二进制读取,不能指定 encoding,用于读取非文本文件。

规则:文件不存在报错,只读取、不修改。

适用场景:读取图片、图标、音频、视频、exe、压缩包。

withopen("img.png", "rb") as f:    data = f.read()

5. wb 二进制覆盖写入

二进制专属覆盖写入,清空原文件、写入二进制数据,常用于文件复制、导出二进制资源。

# 简单文件复制with open("img.png", "rb") as f1, open("img_copy.png", "wb") as f2:    f2.write(f1.read())

6. ab 二进制追加写入

在二进制文件末尾追加数据,保留原内容,不清空文件。


三、进阶读写模式(带 + 号,高频踩坑)

+ 号核心作用:给原有模式补齐读写权限,只读变可读写、只写变可读写,但指针规则、文件创建规则完全不变。

1. r+ 读写模式(重点)

底层规则(极易踩坑):

  • 可读可写,不会清空原有文件内容

  • 文件指针默认在文件开头

  • 文件不存在 直接报错

最大误区:很多人以为 r+ 可以追加,其实从头写入会覆盖开头字符,不会自动后置!

适用场景:修改文件局部内容、读取后更新数据。

2. w+ 清空读写模式

规则:

  • 可读可写

  • 只要打开就清空原有内容(继承 w 的特性)

  • 文件不存在自动创建

痛点:打开瞬间内容就没了,适合「新建文件、写完再读取校验」的场景,不适合修改旧文件。

3. a+ 追加读写模式(日志神器)

规则:

  • 可读可写

  • 永远在文件末尾写入,不会覆盖旧数据

  • 文件不存在自动创建

  • 打开后指针在末尾,直接读会读不到内容,需要手动移动指针

适用场景:日志系统、持续写入+偶尔读取完整文件内容。

with open("log.txt", "a+", encoding="utf-8") as f:    f.write("\n新日志")    # 末尾追加    f.seek(0)             # 指针移到开头    print(f.read())      # 读取全部内容

四、所有模式终极汇总表(收藏备查)

模式

读写权限

文件不存在

原有内容

指针位置

适用场景

r / rt

只读

报错

保留

开头

读取已有文本文件

w / wt

只写

创建

清空

开头

新建/覆盖文件内容

a / at

只写

创建

保留

末尾

日志追加、累加数据

r+

可读可写

报错

保留

开头

局部修改文件内容

w+

可读可写

创建

清空

开头

新建文件后读写校验

a+

可读可写

创建

保留

末尾

持续追加+读取文件

rb

二进制只读

报错

保留

开头

读取图片、视频等资源

wb

二进制只写

创建

清空

开头

导出、复制二进制文件

ab

二进制追加

创建

保留

末尾

追加二进制数据


五、高频踩坑总结(开发必看)

坑1:分不清 r+ 和 a+

  • r+:不清空,但指针在开头,写入会覆盖前文,适合改内容

  • a+:永远后置追加,绝不覆盖,适合加数据

坑2:w 模式无脑使用导致数据丢失

w / w+ 打开文件瞬间清空内容,哪怕不执行 write 操作,文件也会变空,生产环境慎用!

坑3:二进制模式加 encoding 参数

rb / wb / ab 模式下禁止写 encoding,否则直接报错,二进制文件无需编码转换。

坑4:a+ 模式读不到内容

a+ 默认指针在文件末尾,直接读取为空,需要先执行f.seek(0) 将指针移到开头再读取。


六、极简选型口诀(快速记忆)

  • 只读取,用 r,不存在就报错

  • 全覆盖,用 w,旧内容直接无

  • 加新内容,用 a,日志累加最稳妥

  • 改内容不删旧,优先 r+

  • 边写边读不覆盖,必选 a+

  • 图片视频二进制,后缀带 b 不用记


最后总结一下

open() 函数的 mode 参数,核心不是死记字母,而是理解是否新建、是否清空、指针在哪、能否读写四大规则。

选对模式,就能彻底解决文件覆盖、数据丢失、读取为空、二进制报错等常见问题,让你的文件操作代码更稳定、更专业。

日无所获,失落一日,日有所悟,欢欣鼓舞!

所谓千里之行始于足下: 不积跬步,无以至千里。不积小流,无以成江海。骐骥一跃,不能十步。驽马十驾,功在不舍。锲而舍之,朽木不折。锲而不舍,金石可镂。每天进步一点点,成功离我更近一点!

若文章对你有所帮助,请点击右上角或分享, 让你朋友因此而受益!真诚感谢你的关注和推荐!

欢迎交流,有任何问题欢迎留言讨论

AI已经让我们可以直通知识海洋的入口了,一起努力学习吧,解锁自己潜藏的能力!

平时灌溉,才有期待,运气一来,花自盛开!

【特别声明】本公号转载、引用的所有文章、图片、音频、视频文件等资料的版权归版权所有人所有,转载目的在于传递、分享信息给更多人。如果所选内容的作者认为其作品不宜供大家浏览,或不应无偿使用,请及时与我联系,以便迅速采取适当措施,避免给双方造成不必要的损失。

最新文章

随机文章