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. 读写权限字符(核心)
2. 文件格式字符
所有复杂模式,都是这几个字符的排列组合。理解底层规则,比死记硬背更重要。
二、基础 6 种核心模式(必掌握)
1. r / rt 只读模式(默认模式)
规则:
适用场景:纯读取已有文本文件,最安全的文件读模式。
# 只读模式,文件不存在直接报错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+
坑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已经让我们可以直通知识海洋的入口了,一起努力学习吧,解锁自己潜藏的能力!
平时灌溉,才有期待,运气一来,花自盛开!
【特别声明】本公号转载、引用的所有文章、图片、音频、视频文件等资料的版权归版权所有人所有,转载目的在于传递、分享信息给更多人。如果所选内容的作者认为其作品不宜供大家浏览,或不应无偿使用,请及时与我联系,以便迅速采取适当措施,避免给双方造成不必要的损失。