writelines() 不自动添加换行符,需手动为每项添加 '\n';若列表元素不含换行符,则必须处理,否则内容挤在一行;推荐用生成器表达式 f.writelines(f"{item}\n" for item in my_list) 并显式指定 encoding="utf-8"。

为什么 writelines() 写出来的文件没有换行?
因为 writelines() 不自动加换行符——它只是把列表里每个字符串原样拼进去。如果你传的是 ['a', 'b', 'c'],结果就是 abc 一行,不是三行。
常见错误现象:file.writelines(my_list) 执行后打开 txt 看到所有内容挤在一行,甚至分不清哪条是哪条。
- 必须手动给每项末尾加上
'\n'(Windows 下也可用'\r\n',但'\n'通用性更好) - 如果原列表元素本身已含换行符(比如从
readlines()读来的),那可以直接用writelines();否则一定得补 - 注意:不能对数字、字典等非字符串类型直接写入,会报
TypeError: writelines() argument must be a sequence of strings
怎么安全地把字符串列表按行写入?
最稳妥的做法是先做类型检查和换行处理,再调用 writelines()。
- 用生成器表达式逐项转成字符串并加换行:
file.writelines(f"{item}\n" for item in my_list) - 如果列表里可能混有非字符串(如
int、None),先统一转str():file.writelines(str(item) + "\n" for item in my_list) - 避免用
map()配合lambda,可读性差且异常难调试;生成器更直观
with open("output.txt", "w", encoding="utf-8") as f:
f.writelines(f"{line}\n" for line in ["apple", "banana", "cherry"])
用 writelines() 还是 write() + join()?
两者都能实现,但行为和内存表现不同。
-
writelines()是迭代写入,适合大列表(不一次性构造完整字符串,内存友好) -
write("\n".join(my_list))要先把整个字符串拼出来,对超长列表可能触发MemoryError - 如果列表含空值或需要过滤,
writelines()配合生成器更容易控制逻辑(比如跳过None) - 注意编码:无论哪种方式,打开文件时务必显式指定
encoding="utf-8",否则中文可能乱码
容易被忽略的细节:换行符与文件结尾
很多用户没意识到,最后一行是否带换行符会影响后续追加或脚本解析。
- 用
f.writelines(f"{x}\n" for x in lst)会导致文件末尾多一个空行(最后一项后也有\n) - 如果要求严格“每行一个数据,末尾无多余换行”,改用:
f.write("\n".join(map(str, lst))) - Windows 记事本只认
\r\n,但现代编辑器和 Python 默认\n兼容性足够好;真要兼容旧环境,可用os.linesep - 别依赖系统默认编码,
open(..., encoding="utf-8")必须写全,尤其跨平台时
实际项目里,换行逻辑和编码处理漏掉一个,就可能让下游解析脚本静默失败——这种问题往往出现在上线后,而不是本地测试时。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











