文件写入与追加
- 学习主题
- 写入文件、追加内容、文件模式 ‘w’, ‘a’, ‘x’
- 具体知识点
- 写入模式 ‘w’(覆盖写)与追加模式 ‘a’(追加到末尾)
- 使用 file.write() 和 file.writelines() 写入内容
- 独占创建模式 ‘x’(文件已存在会报错)
- 写完后调用 file.flush() 或关闭文件确保落盘
练习 - 写一个简单的日记程序:让用户循环输入日记内容,以 ‘a’ 模式追加到 diary.txt,输入 exit 结束。
- 创建一个新文件 number.txt,用 ‘w’ 模式写入 1~100 的数字,每行一个。
- 尝试用 ‘x’ 模式创建文件,如果文件已存在则提醒用户“文件已存在,换一个名字”。
w
覆盖写入模式,如果文件不存在则创建文件;存在则清空所有内容重新写入
with open("text.txt","w",encoding="utf-8")as file:
file.write("hello word")
a
追加写入模式。文件不存在创建新文件;文件存在末尾继续写入
with open("text.txt","a",encoding="utf-8")as file:
file.write("追加一行")
x
独占写入模式,文件必须不存在,如果已存在该文件就会抛出FileError的错误。适合需要避免意外覆盖的场景。
with open("new_text.txt","x",encoding="utf-8")as file:
file.write("新文件会被创建并写入内容")
file.write()
一次性将该字符串写入文件,不会自动添加换行符。
file.writelines()
将可迭代对象中所有字符串依次写入文件,不会自动换行。
file.flush()与关闭文件
Python文件操作默认使用缓冲区来提升性能。当使用write或writelines时数据通常先写入内存中的缓存区,而不是直接写入磁盘。直接写入磁盘的有下面几种情况。
- 缓冲区写满
- 手动调用flash():立即将缓冲区的数据刷新到操作系统,但操作系统肯还会把数据暂存到系统缓冲区,这时可以调用os.fsync():强制将操作系统数据同步到物理磁盘(更严格,但更慢)。需要先获取文件描述符:os.fsync(f.fileno())
- 关闭文件:close()会自动调用flush(),然后释放文件资源。
- 程序正常结束:解释器退出时会自动关闭打开的文件(但是依赖此行为会造成风险)
- 使用with块:退出块是会自动调用close()
如果不调用会发生什么
如果程序数据还停留在缓冲区时就崩溃或意外终止,那么写入的数据可能会丢失。
即使程序结束会刷新缓冲区,但是依赖此行为是一种不好的习惯。尤其对于一下需要频繁写入或需要实时落盘的场景(如日志,事务)
推荐做法
- 使用with块自动管理关闭,无需手动调用flush,除非需要实时落盘
- 对于需要保证数据立即可见的场景(如多个进程读取一个文件,防止断电),在每次关键写入后调用flush甚至os.fsync
- 避免反复打开关闭文件,利用缓冲区提升性能,只对数据完整性要求极高的数据进行强制落盘。
练习
写一个简单的日记程序:让用户循环输入日记内容,以 ‘a’ 模式追加到 diary.txt,输入 exit 结束。
# 写一个简单的日记程序:让用户循环输入日记内容,以 'a' 模式追加到 diary.txt,输入 exit 结束。
with open("diayr.txt","a",encoding="utf-8") as f:
while True:
wr=input(">")
if wr=="exit":
break
f.write(wr+"\n")
创建一个新文件 number.txt,用 ‘w’ 模式写入 1~100 的数字,每行一个。
# 创建一个新文件 number.txt,用 'w' 模式写入 1~100 的数字,每行一个。
with open("number.txt","w",encoding="utf-8")as file:
for i in range(1,101):
file.write(str(i)+"\n")
尝试用 ‘x’ 模式创建文件,如果文件已存在则提醒用户“文件已存在,换一个名字”。
# 尝试用 'x' 模式创建文件,如果文件已存在则提醒用户“文件已存在,换一个名字”。
import os
while True:
filename=input("请输入要创建的文件:")
if os.path.exists(filename):
print(f"{filename}文件已存在,请重新输入")
continue
else:
with open(filename,"x",encoding="utf-8")as file:
file.write("这是新文件")
print(f"{filename}文件创建成功")
break