别让你的数据“蒸发”了:Python文件写入的生存指南
你有没有过这种时刻?费劲心思打完了游戏里的最终BOSS,想截个图留个纪念,结果游戏崩溃,进度全没了。或者,你辛辛苦苦写了一段程序,处理了一大堆数据,结果程序一关,所有结果烟消云散。
这种感觉,就像你在一张白纸上用铅笔写了半天字,然后有人拿橡皮擦轻轻一抹——一切归零。但如果你把这些内容写进一个文件里,就像刻在石头上,程序关了、电脑重启了,数据还在那儿等你。
今天我们就来聊聊Python里这个看似简单却暗藏杀机的操作——文件写入。
两种模式,两种截然不同的命运
文件写入有两个基本模式,理解它们之间的区别,能让你避免一场数据灾难。
"w" 模式(写入模式):像换新笔记本。你打开一本新本子,把旧的一页撕掉,从头开始写。如果你指定的文件已经存在,它的内容会被彻底清空——不是隐藏,不是归档,是物理意义上的消失,连回收站都找不到。
"a" 模式(追加模式):像在写满的笔记本后面再接一张纸。你保留之前所有的内容,只在末尾继续添加。安全、稳妥、不误伤。
来看个直观的例子:
# w 模式:旧内容被清空
with open("notes.txt", "w") as f:
f.write("今天天气真好!\n")
# a 模式:在原有内容后面追加
with open("notes.txt", "a") as f:
f.write("又写了一句。\n")
如果你先运行第一段,再运行第二段,文件里会有两行。但如果你先运行第二段,再运行第一段——抱歉,只有一行了。这个顺序问题,曾经让多少人在深夜抓狂。
换行符:那个看不见的“回车键”
write() 方法有个坑:它不会自动换行。如果你写三行内容不加 \n,它们会像挤地铁一样全部叠在一起:
with open("hello.txt", "w") as f:
f.write("苹果")
f.write("香蕉")
f.write("橘子")
打开文件,你会看到:苹果香蕉橘子——完全分不开。
\n 就是那个看不见的“回车键”。每次写完一行内容,记得敲一下。这是新手最容易忽略的细节,也是最常见的“为什么我的文件内容全粘在一起”的答案。
一次写多行?用 writelines()
如果你已经准备好了列表,想一口气全写进去,writelines() 是你的朋友。但记住,它同样不会自动加换行——你必须在每个元素末尾手动加上 \n:
lines = ["苹果\n", "香蕉\n", "橘子\n"]
with open("fruits.txt", "w") as f:
f.writelines(lines)
忘了加 \n 的后果?你懂的,所有内容首尾相连,变成一串无意义的字符串。
一个小技巧:用 print() 写文件
其实你每天都在用的 print() 也能写文件,只要加上 file 参数。它默认自动换行,省去了手动加 \n 的麻烦:
with open("output.txt", "w") as f:
print("你好,世界!", file=f)
print("这是第二行。", file=f)
这特别适合输出格式化内容,比如游戏排行榜、日志记录等。
为什么 with 语句是你的安全保险?
每次打开文件后,用完都应该关闭。忘记关闭文件,就像出门没锁门——平时没事,但万一遇到意外(比如程序崩溃),数据可能就丢了。
with open(...) as f: 这种写法会在代码块结束时自动关闭文件,无论代码是否执行成功。它相当于帮你把 try-finally 里的 finally 部分自动处理好了,你不需要手动调用 f.close()。
这引出一道经典的判断题:使用 with 语句打开文件进行写入时,Python 会自动关闭文件,不需要手动调用 close() 方法。 答案显然是正确的。with 语句利用上下文管理器机制,在代码块结束时自动执行清理操作。有些初学者觉得即使用了 with,也必须在代码块最后写 f.close()——实际上这是多余的,而且手动写还可能因为异常而跳过,反而更不可靠。
别让 "w" 模式毁了你
说到坑,"w" 模式是最容易出事的。假设你有一个记录游戏最高分的 score.txt,里面写着你辛苦打出来的 9999 分。某天你想重置分数,写了这么一段代码:
with open("score.txt", "w") as f:
f.write("0\n")
运行完,你的最高分没了。文件被清空,写上了一个孤零零的 0。这不仅是技术问题,还是情感问题——你再也无法证明你曾经是那个击败最终BOSS的勇士。
所以,在不确定文件是否重要时,先用 "a" 模式追加,或者先备份。养成先读后写的习惯,能帮你避免很多不必要的损失。
中文乱码?编码问题了解一下
如果你在文件里写了中文,打开后看到一堆乱码,大概率是编码不一致。解决办法很简单,在 open() 里加上 encoding='utf-8':
with open("中文日记.txt", "w", encoding='utf-8') as f:
f.write("今天很开心。\n")
这样无论在哪台电脑上打开,中文都能正常显示。这是一个容易被忽略但极其重要的细节。
完整示例:做一个简单的日记本
把知识串起来,写一个简单的日记本程序。每次运行,用户输入内容,程序在文件末尾追加,保留所有历史记录:
import datetime
now = datetime.datetime.now()
time_str = now.strftime("%Y-%m-%d %H:%M")
entry = input("写点什么:")
with open("diary.txt", "a", encoding='utf-8') as f:
f.write(f"[{time_str}] {entry}\n")
每次运行,diary.txt 都会多一行带时间戳的记录。这就是数据持久化的雏形——把程序里的变量保存到文件里,下次启动再读出来。
最后说两句
文件写入看似简单,但模式选择、换行符、编码、with 语句——每一个细节都可能成为你踩坑的起点。掌握这些基础,你就能安全地保存程序产生的数据,让它们在你关闭程序后依然存在。
进阶方向:学完写入,别忘了学读取("r" 模式);如果处理图片、音乐等二进制文件,需要 "wb" 或 "ab" 模式;文件路径不在当前目录时,你需要写完整路径或用 os 模块处理。
现在,大胆去写吧——写个备忘录、记录游戏成绩、甚至写一个自动写故事的小程序。数据不再蒸发,一切尽在掌握。
关于作者
我是赵老师,持有 NOI 信息学奥赛教练证书,拥有 15 年以上的软件开发经验,从事信息学少儿编程教学已有 8 年时间。
这些年累计帮助 多名 学生通过编程特长升入自己心仪的目标学校。
如果你在编程学习上有任何疑问,欢迎联系我:18620372957(微信同号)