很多新手刚接触文件写入,一上来就用write()方法,结果要么覆盖了原有内容,要么写入后乱码,甚至报错“PermissionError”。其实问题根源不在于write()方法,而在于没选对“文件写入模式”。
今天讲透Python文件写入的4种核心模式,用实战代码演示每种模式的用法、差异和适用场景,搭配避坑技巧,新手跟着练,一次性搞定文件写入,再也不踩编码和覆盖的坑!
📌 先明确:写入模式的核心分类
文件写入的核心是“模式选择”,不同模式对应不同的写入行为,所有写入操作都基于open()函数的mode参数设置。先记住4种核心写入模式,后续实战逐一验证:
1. 写入模式(w):覆盖写入,若文件不存在则创建,若文件已存在则清空原有内容后写入;
2. 追加模式(a):追加写入,若文件不存在则创建,若文件已存在则在文件末尾追加内容,不覆盖原有内容;
3. 读写模式(r+):可读可写,不能创建新文件,若文件不存在则报错,写入时从光标位置开始覆盖;
4. 写读模式(w+):可读可写,若文件不存在则创建,若文件已存在则清空原有内容,可后续读取写入的内容。
提前说明:所有演示均指定encoding='utf-8',避免中文乱码;推荐用with语句操作文件,自动关闭文件,避免资源泄露。提前准备测试文件(write_test.txt),无则自动创建。
🔍 逐个拆解:4种写入模式实战演示(附代码)
所有演示均围绕“写入内容”展开,重点关注“写入行为”“文件变化”和“模式差异”,代码可直接复制运行,建议跟着实操,直观感受不同模式的区别。
一、写入模式(w):覆盖写入(最常用,需谨慎)
核心特点:默认覆盖原有内容,是最基础的写入模式;若目标文件不存在,Python会自动创建该文件;若文件已存在,会先清空所有内容,再写入新内容(新手最容易踩的坑:误删原有内容)。
实战代码(基础用法):
# 写入模式(w)实战with open("write_test.txt", "w", encoding="utf-8") as file: # 写入字符串内容 file.write("Python文件写入模式:w(覆盖写入)\n") file.write("这是第二次写入的内容")# 查看写入结果(读取文件验证)with open("write_test.txt", "r", encoding="utf-8") as file: print("w模式写入后,文件内容:") print(file.read())
运行结果:
w模式写入后,文件内容:Python文件写入模式:w(覆盖写入)这是第二次写入的内容
补充注意:多次使用w模式写入同一文件,每次都会清空原有内容,只保留最后一次写入的内容,示例如下:
# 多次w模式写入,覆盖原有内容withopen("write_test.txt", "w", encoding="utf-8") asfile: file.write("第一次覆盖写入")with open("write_test.txt", "w", encoding="utf-8") as file: file.write("第二次覆盖写入(原有内容被清空)")# 读取验证with open("write_test.txt", "r", encoding="utf-8") as file: print(file.read()) # 输出:第二次覆盖写入(原有内容被清空)
二、追加模式(a):追加写入(不删原有内容,推荐)
核心特点:不会清空原有内容,新写入的内容会追加在文件末尾;若文件不存在,同样会自动创建;适合需要持续向文件添加内容的场景(如日志记录、数据追加)。
实战代码(基础用法):
# 追加模式(a)实战(基于上面的write_test.txt)withopen("write_test.txt", "a", encoding="utf-8") asfile: file.write("\n这是追加的内容1") file.write("\n这是追加的内容2")# 读取验证with open("write_test.txt", "r", encoding="utf-8") as file: print("a模式追加后,文件内容:") print(file.read())
运行结果:
a模式追加后,文件内容:第二次覆盖写入(原有内容被清空)这是追加的内容1这是追加的内容2
补充说明:a模式的光标默认在文件末尾,无论如何操作,新内容都会追加在最后,不会影响原有内容,是日常开发中最常用的写入模式之一。
三、读写模式(r+):可读可写(不创建新文件)
核心特点:兼具读取和写入功能,但不能创建新文件(若文件不存在,直接报错);写入时不会清空原有内容,从当前光标位置开始覆盖,光标默认在文件开头。
实战代码(重点看光标位置影响):
# 读写模式(r+)实战(需确保write_test.txt已存在)# 场景1:光标在开头,写入会覆盖开头内容withopen("write_test.txt", "r+", encoding="utf-8") asfile: # 先读取部分内容,观察光标变化 content = file.read(10) print("读取的前10个字符:", content) # 此时光标在第10个字符后,写入内容会从这里开始覆盖 file.write("【光标位置写入】")# 读取验证withopen("write_test.txt", "r", encoding="utf-8") asfile: print("\nr+模式写入后,文件内容:") print(file.read())
运行结果:
读取的前10个字符: 第二次覆盖写入r+模式写入后,文件内容:第二次覆盖写入【光标位置写入】加的内容1这是追加的内容2
关键避坑:r+模式必须保证文件已存在,否则会报“FileNotFoundError”;写入时是“覆盖光标位置内容”,不是追加,也不是清空全部。
四、写读模式(w+):可读可写(创建新文件,清空内容)
核心特点:兼具读取和写入功能,若文件不存在则创建,若文件已存在则清空原有内容;写入后可直接读取,但需注意光标位置(写入后光标在文件末尾,直接读取会返回空字符串)。
实战代码(重点解决“写入后读取不到”的问题):
# 写读模式(w+)实战with open("write_test2.txt", "w+", encoding="utf-8") as file: # 写入内容 file.write("w+模式:可读可写,清空后写入") # 光标在文件末尾,直接读取会返回空 print("写入后直接读取:", file.read()) # 重置光标到文件开头(用seek(0),后续会详细讲解) file.seek(0) # 再次读取,就能获取写入的内容 print("重置光标后读取:", file.read())
运行结果:
写入后直接读取: 重置光标后读取: w+模式:可读可写,清空后写入
补充说明:w+模式适合“先清空原有内容,再写入,最后读取验证”的场景,核心是记得用seek(0)重置光标,否则读取不到写入的内容。
📊 一张表分清4种写入模式(必存)
新手容易混淆4种模式,整理了核心差异表,日常使用直接对照,再也不用反复试错:
模式 读写权限 文件不存在 文件已存在 光标默认位置 核心适用场景w 只写 自动创建 清空内容后写入 开头 覆盖写入、新建文件a 只写 自动创建 末尾追加内容 末尾 日志记录、持续追加r+ 可读可写 报错 光标位置覆盖 开头 读取后修改部分内容w+ 可读可写 自动创建 清空内容后读写 开头 写入后需读取验证
❌ 新手必避的4个写入坑(附解决方案)
文件写入的坑,大多和“模式选择”“编码”“光标”有关,每个坑都对应具体解决方案,遇到报错直接对照解决:
坑1:用w模式误删原有文件内容 解决方案:确认不需要保留原有内容时再用w模式;若需保留,改用a模式或r+模式。
坑2:写入中文出现乱码(如乱码问号、方框) 解决方案:open()函数中必须指定encoding='utf-8',统一编码格式,避免系统默认编码不兼容。
坑3:r+模式报错“FileNotFoundError” 解决方案:r+模式不能创建新文件,先确认文件已存在,或改用w+模式(需接受清空内容)。
坑4:w+模式写入后读取不到内容 解决方案:写入后光标在文件末尾,用file.seek(0)将光标重置到开头,再进行读取。
📝 核心总结
1. 写入的核心是“模式选择”,4种模式的核心差异的是“是否创建文件”“是否覆盖内容”“是否可读”;
2. 日常开发:追加内容用a模式,覆盖写入用w模式,读取后修改用r+模式,写入后验证用w+模式;
3. 必加encoding='utf-8',避免中文乱码;必用with语句,自动关闭文件,避免资源泄露;
4. 光标位置影响写入/读取结果,后续会专门讲解seek()方法,解决光标操作问题。
文件写入不用死记硬背,重点是分清“是否要保留原有内容”“是否需要读取”,再对应选择模式。多实操两次,就能灵活应对所有写入场景——比如记录程序日志用a模式,生成新文件用w模式,修改已有文件用r+模式。
✨ 小任务:用今天学的4种模式,分别向同一个文件(或不同文件)写入内容,观察每种模式的写入行为,重点验证w模式的覆盖性、a模式的追加性,以及r+和w+的差异,巩固用法。
读懂代码的骨架,驾驭AI的血肉,做数字时代的超级个体🔥