前面几章,我们已经把文件操作最核心的几个基础点打下来了。
你已经知道什么是文件读写 知道 open() 是入口 知道 r、w、a 这几种常见模式 也知道了为什么正式代码更推荐用 with
但很多人学到这里,脑子里还是散的。 知识点看着都懂,一到自己写代码,就容易乱。
比如:
什么时候该用 read()什么时候该用 write()什么时候用追加 为什么有时候文件内容被覆盖了 为什么有时候写完再读,结果和自己想得不一样
所以这一章,我们不再零碎地讲单个知识点,而是把读文本文件、写文本文件、追加内容这三件最常用的事,放在一起完整演示。你真正把这一章吃透,文件操作就算正式入门了。
一、先把三个动作分清楚
虽然都叫文件操作,但读、写、追加,其实是三种完全不同的行为。
读文件,重点是把外部内容拿进程序里。 写文件,重点是把程序里的内容保存出去。 追加文件,重点是在保留原内容的前提下,继续往后补内容。
这三件事如果混在一起学,很容易出错。 但只要你脑子里先分开,代码就会清楚很多。
你可以这样记:
读取,是拿进来。 写入,是重新放进去。 追加,是接着往后放。
二、先看最简单的读取文本文件
假设当前目录下有一个 note.txt 文件,内容如下:
今天学习 Python明天继续练习文件操作
现在我们把它读出来。
with open('note.txt', 'r', encoding='utf-8') as f: content = f.read()print(content)
输出结果:
今天学习 Python明天继续练习文件操作
这里最关键的点有两个。
第一,模式是 r表示这是读取文件
第二,f.read() 会一次性把整个文件内容全部读出来 返回值通常是一个字符串
也就是说,文件里的多行文字,进到程序以后,本质上就是一个字符串变量。 一旦成了字符串,你后面就能继续做切片、查找、替换、分割等操作。
这一步你一定要真正理解。 因为文件读取的目的,不是为了把内容打印一下就完了,而是为了把数据拿进程序继续处理。
三、读取之后,内容其实已经变成普通变量了
很多初学者有一个模糊点:
读完文件以后,内容到底在哪里
答案是,在变量里。
比如刚才这段代码:
with open('note.txt', 'r', encoding='utf-8') as f: content = f.read()print(type(content))print(content)
这里的 content 就已经是一个字符串变量了。
你甚至可以这样做:
with open('note.txt', 'r', encoding='utf-8') as f: content = f.read()new_content = content.replace('Python', 'Python 语言')print(new_content)
这说明什么?
说明文件只是数据的来源。 真正进入程序以后,你处理的其实是变量,不是文件本身。
把这一层想通,后面你就不会总把文件和字符串混在一起了。
四、再看写文本文件
现在我们换个场景。 假设你想创建一个学习记录文件,把今天的学习内容写进去。
with open('study_log.txt', 'w', encoding='utf-8') as f: f.write('今天学了文件读写\n') f.write('已经会使用 with 语句\n')
执行后,会生成一个 study_log.txt 文件,内容大概是这样:
今天学了文件读写已经会使用 with 语句
这里要注意三件事。
第一,模式是 w表示写入模式
第二,write() 是把字符串写进文件 所以你传进去的通常就是字符串
第三,w 的行为是重写 如果文件原本不存在,就创建 如果文件原本存在,就清空旧内容再写新内容
这一点很重要。 因为很多人第一次写文件时,误以为自己是在往后补内容,结果一运行,把原来的内容全覆盖了。
五、为什么写文件时经常要自己加换行
看下面这段代码:
with open('demo.txt', 'w', encoding='utf-8') as f: f.write('第一行') f.write('第二行')
你可能以为结果会分成两行。 其实不会。
文件内容会变成:
第一行第二行
因为 write() 只负责原样写入,它不会自动帮你换行。
如果你想让内容分行,就要自己加 \n。
with open('demo.txt', 'w', encoding='utf-8') as f: f.write('第一行\n') f.write('第二行\n')
这时候文件内容才会是:
第一行第二行
所以写文本文件时,你要始终记住一点:
换行不是自动发生的,而是你自己控制的。
这个细节很小,但几乎所有初学者都会在这里踩一次坑。
六、追加内容到底和写入有什么不同
现在来看第三个动作,追加。
假设你已经有一个 study_log.txt 文件,内容是:
今天学了文件读写已经会使用 with 语句
这时候你又想补一条新的学习记录。 如果你还用 w,原内容就会被覆盖。 所以这里应该用 a。
with open('study_log.txt', 'a', encoding='utf-8') as f: f.write('下一步准备学习 CSV 文件\n')
执行后,文件会变成:
今天学了文件读写已经会使用 with 语句下一步准备学习 CSV 文件
这就是追加模式的意义。
它不会破坏原内容。 它只是在原文件末尾,继续往后写。
你可以把 w 和 a 的区别再记一遍:
w 是重写a 是续写
只要这个区别不混,文件写入就不会乱。
七、把读、写、追加放在一起看,一下就清楚了
现在我们把三个动作放在一套完整流程里。
第一步,先创建一个文件并写入初始内容。
with open('record.txt', 'w', encoding='utf-8') as f: f.write('第一天:学会读文件\n') f.write('第二天:学会写文件\n')
第二步,再追加一条内容。
with open('record.txt', 'a', encoding='utf-8') as f: f.write('第三天:学会追加文件内容\n')
第三步,最后把整个文件读出来看看。
with open('record.txt', 'r', encoding='utf-8') as f: content = f.read()print(content)
输出结果:
第一天:学会读文件第二天:学会写文件第三天:学会追加文件内容
这一套代码非常值得你亲手敲一遍。 因为它把文件操作最核心的三种日常场景,一次性串起来了。
八、你要学会从程序视角理解这三件事
站在程序的角度看:
读文件,是把外部数据读进内存。 写文件,是把内存里的数据落到硬盘。 追加文件,是在已有硬盘数据后面继续补充内容。
这一层理解,比死记语法更重要。
很多人学代码喜欢背:
r 读w 写a 追加
这当然没错,但不够深。 真正有用的是,你一看到需求,就能知道自己该选哪种模式。
比如:
想查看文章内容,用 r想重新生成报表,用 w想每天往日志里补记录,用 a
只要这种判断力建立起来,文件操作就不会只是机械套语法。
九、一个特别常见的错误:以为写完立刻就会自动换结构
比如有人写:
with open('data.txt', 'w', encoding='utf-8') as f: f.write('姓名:张三') f.write('年龄:18') f.write('城市:北京')
然后看到结果:
姓名:张三年龄:18城市:北京
就以为 Python 出问题了。
其实不是。 原因很简单,你写进去的就是连续字符串,程序只是在老老实实照做。
正确写法应该是自己把格式设计好,比如:
with open('data.txt', 'w', encoding='utf-8') as f: f.write('姓名:张三\n') f.write('年龄:18\n') f.write('城市:北京\n')
或者:
with open('data.txt', 'w', encoding='utf-8') as f: text = '姓名:张三\n年龄:18\n城市:北京\n' f.write(text)
这也提醒你一个很重要的思路:
文件不会替你组织内容结构,结构要靠你自己设计。
十、再做一个更贴近实际的小案例
假设你想做一个最简单的学习打卡记录器。 每天运行程序,就往文件里追加一条学习记录。 最后再把所有记录读出来。
代码如下:
today_record = '2026-03-26 学习了 Python 文件操作\n'with open('checkin.txt', 'a', encoding='utf-8') as f: f.write(today_record)with open('checkin.txt', 'r', encoding='utf-8') as f: all_records = f.read()print(all_records)
这个例子虽然简单,但已经很接近真实使用场景了。
因为现实里的很多程序,本质上都是这样工作的:
先保存数据 再读取数据 再展示或处理数据
比如日志系统、配置文件、缓存文件、学习记录、导出结果,本质上都离不开这些基本动作。
十一、读取和打印,不是一回事
这一点很多初学者容易混。
看代码:
with open('note.txt', 'r', encoding='utf-8') as f: content = f.read()
这里做的是读取。 只是把文件内容拿到变量 content 里。
而下面这句:
print(content)
做的是打印。 是把变量的值显示到屏幕上。
也就是说:
读取,是数据进入程序。 打印,是数据展示给你看。
这两个动作经常连在一起出现,所以新手容易把它们看成一件事。 但实际上,它们完全不是同一个步骤。
明白这一点以后,你就会知道,文件内容读出来以后,不一定非要打印。你还可以做统计、筛选、清洗、判断,甚至写入另一个文件。
十二、一个常见误区:每次写文件都以为是在修改原文件内容中间某一段
新手刚接触文件时,脑子里很容易把文件想成文档编辑器。 觉得自己写一段代码,就像在 Word 里改某几行字一样自然。
但最基础的文件操作不是这样的。
在你当前这个阶段,最常见的行为其实只有三种:
整份读出来 整份重写 在末尾追加
也就是说,你现在不是在学高级文本编辑器,而是在学最基本的数据读写流程。
先把这三个动作吃透,后面再慢慢接触更复杂的文件定位、逐行处理、结构化存储,会轻松很多。
十三、完整演示一遍,从零创建到追加再到读取
下面我们做一个从头到尾的完整案例。 建议你一定亲自运行。
with open('my_notes.txt', 'w', encoding='utf-8') as f: f.write('第一条:今天开始学文件操作\n') f.write('第二条:已经理解读和写的区别\n')with open('my_notes.txt', 'a', encoding='utf-8') as f: f.write('第三条:追加不会覆盖原内容\n')with open('my_notes.txt', 'r', encoding='utf-8') as f: result = f.read()print(result)
输出结果:
第一条:今天开始学文件操作第二条:已经理解读和写的区别第三条:追加不会覆盖原内容
你可以暂停一下,问自己三个问题。
第一段为什么用 w因为要从零创建并写入初始内容
第二段为什么用 a因为要保留前面的内容,只新增一条
第三段为什么用 r因为最后要把文件全部读出来检查结果
如果这三个问题你都能自己答出来,说明你已经不只是会抄代码,而是真的开始理解文件操作了。
十四、初学者最容易犯的四个错
第一个错,用 w 追加内容。 结果不是追加,而是把旧内容覆盖掉了。
第二个错,忘了加 \n。 结果原本想分三行,最后全挤成一行。
第三个错,把读取和打印混为一谈。 以为 read() 本身就会自动显示内容。
第四个错,读写模式选错。 想读文件却用了 w,想追加却用了 r。
这些问题看起来不大,但会直接影响你对文件操作的理解。 所以这一章最重要的,不只是把代码跑通,还要把这些坑提前绕开。
十五、一个很实用的小技巧:先想结果,再决定怎么写
很多人写文件代码时,一上来就敲 open()。 其实更稳妥的思路是,先问自己结果是什么。
我最终是想看文件内容 还是想保存数据 还是想保留原内容继续补充
只要这个结果一明确,模式就很好选。
想看内容,用 r想重新生成,用 w想继续补充,用 a
你会发现,很多语法问题本质上都不是语法问题,而是思路没先想清楚。
十六、本章小练习
你可以立刻做下面这个练习,效果非常好。
第一步,创建一个 plan.txt 文件,写入两行学习计划:
今天学习文件读取 明天学习 CSV 文件
第二步,再追加一行:
后天开始学习异常处理
第三步,读取整个文件并打印出来
参考代码:
with open('plan.txt', 'w', encoding='utf-8') as f: f.write('今天学习文件读取\n') f.write('明天学习 CSV 文件\n')with open('plan.txt', 'a', encoding='utf-8') as f: f.write('后天开始学习异常处理\n')with open('plan.txt', 'r', encoding='utf-8') as f: content = f.read()print(content)
只要你亲手跑通这段代码,读、写、追加三件事基本就算彻底理顺了。
十七、本章总结
这一章其实只围绕三件事展开,但这三件事非常关键。
读文件,是把内容拿进程序。 写文件,是重新写入内容,原内容可能被覆盖。 追加文件,是在保留旧内容的基础上继续往后补。read() 读出来的通常是字符串。write() 不会自动换行,格式要自己控制。with 是最推荐的文件操作写法,因为更安全,也更清晰。
学到这里,文件读写的基础骨架你已经搭起来了。 下一章我们继续往前走,进入更常见的数据场景:处理 CSV 文件:表格数据的第一步。