当前位置:首页>python>Python文件IO:文件写入模式

Python文件IO:文件写入模式

  • 2026-10-11 08:21:15
Python文件IO:文件写入模式

很多新手刚接触文件写入,一上来就用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的血肉,做数字时代的超级个体🔥

最新文章

随机文章