python中用open()以"a"模式追加写入时,文件不存在会自动创建,存在则在末尾追加且不覆盖原内容;需显式指定encoding防乱码,write()不自动换行须加"\n",推荐with语句管理。

用 open() 以 "a" 模式打开文件再写入
Python 中最直接的方式是用 open() 函数指定 "a"(append)模式,它会自动将光标定位到文件末尾,且不会清空原有内容。注意:如果文件不存在,"a" 模式会自动创建新文件,这点和 "r" 不同。
常见错误是误用 "w" 模式——它会覆盖整个文件,哪怕只写一行也会丢掉之前所有内容。
-
"a"模式下,每次.write()都追加在末尾,不自动换行,需手动加"\n" - 若要写多行,推荐用
.writelines(),但传入的每条字符串需自行带换行符 - Windows 和 Linux 换行符不同(
\r\nvs\n),如需跨平台兼容,建议统一用\n并依赖 Python 的 universal newlines 处理
避免中文乱码:必须显式指定 encoding 参数
不加 encoding 参数时,open() 使用系统默认编码(Windows 常为 cp936,Linux/macOS 常为 utf-8),导致中文写入或读取时报 UnicodeEncodeError 或显示乱码。
实操中应始终显式声明编码,尤其涉及中文、日文等非 ASCII 字符:
with open("log.txt", "a", encoding="utf-8") as f:
f.write("用户登录成功\n")
- 推荐统一用
encoding="utf-8",覆盖绝大多数场景 - 若原文件是 GBK 编码且不能重存,追加时也得用
encoding="gbk",否则可能破坏文件结构 - 用
locale.getpreferredencoding()查当前系统编码仅作参考,不可用于生产逻辑判断
确保写入立即生效:必要时调用 flush() 或控制 buffering
Python 默认开启缓冲,.write() 后内容可能暂存在内存里,未真正落盘。极端情况下(如程序崩溃、断电),刚追加的内容会丢失。
以下情况建议主动刷新:
- 写入关键日志(如“交易完成”)后,加
f.flush() - 用
with语句时,退出上下文会自动close()并刷盘,但close()本身不保证立即落盘(OS 层仍有缓存) - 对实时性要求极高时,可设
buffering=1(行缓冲)或0(无缓冲,仅限二进制模式);但频繁刷盘影响性能,慎用
追加内容前需要检查文件是否存在?其实没必要
"a" 模式本身具备“存在则追加,不存在则创建”的语义,无需提前用 os.path.exists() 判断——多一次系统调用,还引入竞态风险(判断存在后、打开前被删除)。
唯一例外是:你需要区分“追加到已有文件”和“首次创建并写入”两种逻辑。此时可捕获 FileNotFoundError,但更稳妥的做法是先尝试 "r+" 打开,失败再用 "w+" 初始化,而非依赖存在性检查。
实际项目中,日志类、临时数据累积类场景,直接上 "a" 最省心也最可靠。
追加操作看似简单,但编码、缓冲、模式选择这三点一旦出错,轻则内容乱码,重则数据静默丢失——它们不出现在语法报错里,却最难排查。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











