Python 创建 TXT 文件时,可以用 open() 的 "w" 模式打开文件,再调用 write() 写入文字。下面这段代码适用于 Python 3.10 及以上版本,生成的 notes.txt 位于当前工作目录。
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("你好\n")
方法一:用 open() 创建并写入 TXT
1. 确定保存位置
选一个能写入的目录。如果只写文件名,Python 会把它当作相对路径,从进程的当前工作目录开始查找。用 IDE 或定时任务运行脚本时,工作目录可能和脚本所在位置不同。找不到输出文件时,先用 Path.cwd() 确认运行环境,再决定是否使用明确的输出目录。
2. 以写入模式打开文件
用 with open(...) 管理文件。缩进块结束后,Python 会关闭文件,块里报错时也会执行关闭。"w" 打开文件时就会截断同名旧文件,即使还没有执行 write()。有旧稿需要保留时,先换名字或用 "x" 模式。
3. 写入字符串
在缩进块里调用 f.write(...)。write() 接受字符串,返回写入的字符数。需要换行就在字符串里加 \n。等 with 代码块结束后,再用编辑器打开文件核对内容。只写一个字符串时,也可以用下面的 Path.write_text()。
w、a、x 三种模式怎么选?
| 模式 | 同名文件已存在 | 文件不存在 | 常用场景 |
|---|---|---|---|
w | 清空后写入 | 创建 | 每次生成最新报表 |
a | 从文件末尾追加 | 创建 | 逐条记录任务日志 |
x | 报 FileExistsError | 创建 | 避免覆盖已有文档 |
with open("activity.txt", "a", encoding="utf-8") as f:
f.write("本次导出完成\n")
运行两次会写入两条日志。如果旧文件最后一行没有换行,第一次追加的文字会接在旧内容后面。外部软件生成的 TXT 还可能使用不同的编码,追加前要确认整个文件的编码一致。
写入多行文字
可以多次调用 write(),也可以把一组字符串传给 writelines()。writelines() 不会为每一项自动补换行,需要在各行末尾写上 \n。用 print(..., file=f) 时则默认在输出末尾补一个换行,适合把多个值拼成一行。
with open("tasks.txt", "w", encoding="utf-8") as f:
f.write("今日事项\n")
f.writelines(["发送初稿\n", "整理笔记\n"])
print("事项总数", 2, file=f)
方法二:用 pathlib 写入文件
Path.write_text() 会打开文件、写入字符串并关闭文件。如果文件存在,它会替换原有内容。使用路径对象拼接目录和文件名,脚本可以在不同系统上使用。
from pathlib import Path
Path("notes.txt").write_text("你好", encoding="utf-8")
需要输出到多层目录时,先创建父目录。parents=True 让它补建缺少的上级目录,exist_ok=True 允许目标目录已经存在。遇到同名普通文件时,仍需改名或调整路径。
from pathlib import Path
output = Path("exports") / "daily" / "notes.txt"
output.parent.mkdir(parents=True, exist_ok=True)
output.write_text("你好\n", encoding="utf-8")
写入中文乱码怎么办?
新建文件时直接写 encoding="utf-8",避免依赖操作系统或 Python 版本的默认编码。接收端也要按 UTF-8 打开。如果对方的旧工具明确要求带签名的 UTF-8,则在新文件上用 encoding="utf-8-sig"。它会在开头写入 BOM。接收端要求首字节必须是普通正文时,通常选择不带 BOM 的 UTF-8。
换行和编码可以分别指定。默认情况下,写入时的 \n 会按系统的换行约定处理。如果输出必须跨平台保持相同字节,可以用 newline="\n" 固定为 LF,或用 newline="\r\n" 固定为 CRLF。需要 CRLF 时,在传给 write() 的字符串里仍写 \n,由 Python 完成转换。
with open("legacy-import.txt", "w", encoding="utf-8-sig", newline="\r\n") as f:
f.write("姓名\n张三\n")
如果已有文件是 GBK,要先按原编码读出正确文字,再另存为 UTF-8。只改扩展名或用错误编码读入再保存,都不能修复原文字。行尾相关的问题可以参考 CRLF 和 LF 的区别。
常见报错怎么查?
FileNotFoundError:写入时常见原因是父目录不存在。核对目录层级,再创建缺少的目录。PermissionError:确认目录允许当前用户写入,并检查文件是否被另一个程序占用。可以先换到自己有写入权限的文件夹试一次。FileExistsError:使用了x且同名文件已存在。换一个文件名,或在确实要替换旧内容时才改成w。UnicodeEncodeError:当前编码无法表示某个字符。中文、外文和表情混排的文本通常用 UTF-8。导入老系统时,需要按它明确支持的编码准备内容。
不写代码也能生成 TXT
- 打开本页下方的编辑器,输入或粘贴文字。
- 填写文件名,按接收端的要求选择编码和换行符。
- 下载文件。要检查下载结果,可以查看 Windows 新建和打开 TXT 或 Mac 处理 TXT 的方法。
常见问题
怎么新建一个空白文件?
用 x 模式打开后直接退出代码块。采用 UTF-8 时,这段代码会生成零字节文件。如果同名文件已存在,Python 会报错并保留原文件。
with open("empty.txt", "x", encoding="utf-8"):
pass
write() 会自动换行吗?
不会。想在哪换行,就在字符串对应位置加 \n。使用 print(..., file=f) 时,默认会在每次输出末尾加一个换行。
为什么运行完脚本,文件夹里找不到 TXT?
先确认看到的是进程的工作目录。如果用相对路径运行脚本,终端所在目录和脚本目录可能不同。用 Path.cwd() 查看工作目录,再到相应路径下找文件。