应使用循环或join写入列表,需转字符串并处理换行符与编码;推荐with open(..., encoding='utf-8', newline='')确保安全、兼容和正确。

用 write() 循环写入每行,别直接写列表
直接 f.write(my_list) 会报 TypeError: write() argument must be str, not list——文件写入只接受字符串。循环是最直观的解法,但要注意换行符和类型转换。
- 每项必须转成字符串,
str(item)最稳妥,尤其含数字或None时 - 手动加
\n,否则所有内容挤在一行;print(item, file=f)可自动换行,但会多一个空行(因print默认末尾加换行) - 如果列表很大,循环写入内存友好,但 I/O 频次高,性能略低
f = open('out.txt', 'w')
for item in my_list:
f.write(str(item) + '\n')
f.close()
用 '\n'.join() 一次性写入,适合中小列表
join() 快、简洁,但前提是所有元素都是字符串。常见错误是忘记转换,导致 TypeError: sequence item 0: expected str instance, int found。
- 统一转字符串:用
[str(x) for x in my_list]或map(str, my_list) - 空列表时
'\n'.join([])返回空字符串,不会出错,但文件会为空——需按业务判断是否要写空行或提示 - 大列表(如 >10 万项)拼接成单个字符串可能暂用较多内存,但通常比循环 I/O 更快
f = open('out.txt', 'w')
f.write('\n'.join(map(str, my_list)))
f.close()
写入前考虑编码和换行符:Windows 和 Linux 不一样
不指定编码,Python 3 默认用系统 locale 编码(Windows 上常是 cp936),中文易乱码;不处理换行符,Git 或跨平台工具可能标红 CRLF 警告。
- 显式指定
encoding='utf-8',几乎无例外 - 用
newline=''让 Python 统一处理换行(write()中的\n自动转为系统原生换行符),避免手动写\r\n - 打开模式选
'w'即可,不用'wt'(文本模式是默认)
with open('out.txt', 'w', encoding='utf-8', newline='') as f:
f.write('\n'.join(map(str, my_list)))
别忽略上下文管理器:with 不是可选项
裸用 open() + close() 容易漏关文件,尤其抛异常时。资源没释放,轻则文件被占用,重则数据写入不全(缓冲区未刷盘)。
立即学习“Python免费学习笔记(深入)”;
-
with确保无论是否异常都会调用__exit__,安全关闭并刷盘 - 不要写
f = open(...); ...; f.close(),哪怕后面加了try/finally——太啰嗦且易错 -
with块结束即不可再访问f,这是保护,不是限制
真正麻烦的是忘记它——尤其从脚本快速改写时,顺手删掉 with 还自以为省事。










