本文要点
检查目标是否已被占用,用 Path.exists()
按文档说明,write_text 返回写入的字符数
write_text 覆盖同名文件时,是把新内容写进去,原内容不会自动另存一份

本文目录
先回答:write_text 会覆盖同名文件,所以写之前先看目标在不在
如果你准备把一段文本保存成一个新文件,用 Path.write_text 是最直接的做法。但按 pathlib 文档的说明,write_text 打开目标路径、写入数据、然后关闭文件,并且“An existing file of the same name is overwritten”——同名文件会被覆盖。
这句话决定了操作顺序:不是先写,而是先检查目标路径上有没有已经存在的文件。存在,就先备份或换一个文件名;不存在,才按新文件写入。
本文只处理一个自建场景:在专门的练习目录里,把一段文本写进一个新的目标文件,并在写入前检查目标是否已被占用。不涉及批量改写、不涉及遍历目录自动处理,也不涉及其他文件格式。所有路径和内容都是练习用的自建示例,不是对真实文件的记录。
动手前请把练习文件放在单独目录,例如 exercise/,不要拿重要文件直接试。
用 exists 检查目标:先看这个路径上有没有东西
检查目标是否已被占用,用 Path.exists()。按文档说明,它在该路径指向一个已存在的文件或目录时返回 True,路径无效、不可访问或缺失时返回 False。
下面这段只操作练习目录里的路径,不写入任何内容,只是先看目标状态:
from pathlib import Path
target = Path("exercise/notes_new.txt")
print(target.exists())如果输出 True,说明这个路径上已经有文件或目录,此时直接 write_text 会覆盖它。如果输出 False,说明这个路径当前没有东西,可以按新文件写入。
一个容易忽略的点:exists() 对文件和目录都返回 True。所以看到 True 之后,还要分清占用这个路径的是文件还是目录。用 is_file() 和 is_dir() 可以区分:前者在路径指向普通文件时返回 True,后者在指向目录时返回 True。如果目标其实是一个目录,write_text 不是“覆盖”它,而是会失败,这时应该换一个文件名。
本节只讲写入前的目标检查,不涉及读取文件内容,也不涉及删除或移动。
自建示例:在专门目录里写入一个新的目标文件
假设练习目录 exercise/ 已经存在,你要把一段自建文本写进 exercise/notes_new.txt,并且这个文件名在目录里还没有被占用。
先检查,再写入:
from pathlib import Path
target = Path("exercise/notes_new.txt")
if target.exists():
print("目标已被占用,先备份或换名")
else:
written = target.write_text("这是自建练习文本。", encoding="utf-8")
print(written)按文档说明,write_text 返回写入的字符数。上面这段的输入是一段自建字符串,输出是写入的字符数,同时文件被创建。
这里显式写了 encoding="utf-8"。文档说明 write_text 的 encoding、errors、newline 参数与内置 open() 含义相同,不写时使用平台默认编码。为了让文件在别的机器上读出来一致,建议自己指定编码,而不是依赖默认值。
本节只演示一次写入一个新文件。不自动遍历目录,不批量改写已有文件。
为什么必须先备份:覆盖之后原内容不会自动留底
write_text 覆盖同名文件时,是把新内容写进去,原内容不会自动另存一份。文档只说明同名文件会被覆盖,没有提供任何自动备份行为。
所以“先备份”不是多余步骤,而是覆盖动作本身带来的要求。备份的做法可以很简单:在写入前,把原文件复制一份到另一个名字,例如加一个 .bak 后缀,或者复制到练习目录下的 backup/ 子目录。复制用 shutil.copy2 或系统自带的复制功能都可以,本文不展开具体命令。
需要提醒的是:备份要放在写入之前做,不能等写完再补。写完之后原内容已经被新内容替换,再复制得到的只是新内容。
本节只讲备份的必要性和时机,不涉及版本控制、不涉及自动备份脚本。
把范围限制在新建目标文件:不自动遍历、不批量改写
用 write_text 保存文本时,最容易出问题的做法是:先遍历一个目录,然后对每个匹配到的文件都调用 write_text。这样做的后果是,目录里所有匹配文件都会被覆盖,而你可能只打算改其中一个。
本文的做法是把范围收窄到两个条件:
1. 只在一个专门的练习目录里操作,例如 exercise/,不指向工作目录或系统目录。
2. 只写一个明确的新目标文件名,例如 exercise/notes_new.txt,不对目录做遍历。
也就是说,写入的对象是你自己指定的那一个路径,而不是“所有符合条件的文件”。如果确实需要处理多个文件,也应该先列出清单、逐个确认,再决定是否写入,而不是让程序自动遍历改写。
本节只讲如何限定写入范围,不涉及 glob、rglob 或目录遍历的具体写法。
写入后怎么核对:读回来对照,并确认没有动到别的文件
写入完成后,可以用 read_text 把文件读回来,和写入的字符串对照:
from pathlib import Path
target = Path("exercise/notes_new.txt")
print(target.read_text(encoding="utf-8"))读回来的内容应该和你写入的字符串一致。如果不一致,先检查是不是写到了别的路径,或者编码参数和写入时不一致。
除了内容,还要核对范围:确认这次操作只创建或修改了你指定的那一个新目标文件,练习目录里的其他文件没有被改动。这一步是“不自动遍历改写”这条要求的检查方式。
本节只讲写入后的核对方法,不涉及文件权限、不涉及文件时间戳的读取。
使用限制与参考资料
本文只讨论 Path.write_text 在自建示例目录中写入一个新目标文件的场景,以及写入前检查目标、写入前备份、限定写入范围这几件事。
不涉及的内容包括:批量遍历改写、其他文件格式的写入、文件权限设置、并发写入、以及 write_text 之外的其他写入方式。这些资料没有支持,本文不展开。
版本方面,write_text 自 Python 3.5 起提供;newline 参数自 3.10 起加入。本文示例没有使用 newline 参数。
所有示例路径和文本均为自建练习数据,不是对真实文件的测试记录。实际操作前请先备份,并只在专门的练习目录里进行。
参考资料:Python 官方 pathlib 文档,https://docs.python.org/3/library/pathlib.html。
观看知识要点视频 18 秒
18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。
参考资料
以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。
请结合原始资料的适用条件阅读。
返回文件整理 →