第30天:python文件写入与追加

12 阅读4分钟

文件写入与追加

  • 学习主题
    • 写入文件、追加内容、文件模式 ‘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时数据通常先写入内存中的缓存区,而不是直接写入磁盘。直接写入磁盘的有下面几种情况。

  1. 缓冲区写满
  2. 手动调用flash():立即将缓冲区的数据刷新到操作系统,但操作系统肯还会把数据暂存到系统缓冲区,这时可以调用os.fsync():强制将操作系统数据同步到物理磁盘(更严格,但更慢)。需要先获取文件描述符:os.fsync(f.fileno())
  3. 关闭文件:close()会自动调用flush(),然后释放文件资源。
  4. 程序正常结束:解释器退出时会自动关闭打开的文件(但是依赖此行为会造成风险)
  5. 使用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

在这里插入图片描述