windows下用open()写csv必出乱码和空行,因python 3默认编码cp936与excel认的utf-8-sig不匹配,且universal newlines机制导致换行符被双重处理(\r\n\r\n),正确写法必须同时指定encoding='utf-8-sig'和newline=''。

Windows系统下用open()写CSV文件,不指定编码和换行参数,基本必出乱码和空行。
为什么用open()直接写CSV会出问题?
Python 3 默认用系统编码(Windows 是 cp936),而 Excel 默认只认 utf-8-sig;同时 open() 在 Windows 下默认启用 universal newlines,导致 \n 被转成 \r\n\r\n,Excel 里就看到隔行空白。
-
csv.writer本身不处理编码,它只管按指定分隔符写入数据,编码全靠文件对象 - 用
open(..., mode='w')写入时,若没设newline='',csv.writer的writerow()会额外加一次换行 - 直接用
print()或f.write()写 CSV 字符串,更难控制换行和编码一致性
正确写法:用 open() + csv.writer 组合
关键就两个参数:encoding='utf-8-sig' 和 newline='',缺一不可。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
import csv
with open('data.csv', 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['姓名', '城市'])
writer.writerow(['张三', '北京'])
writer.writerow(['李四', '上海'])
-
encoding='utf-8-sig':让 Excel 能自动识别 UTF-8,开头加 BOM(\ufeff) -
newline='':禁用 Python 的换行转换,把换行控制权完全交给csv.writer - 不要用
encoding='gbk'或'utf-8'(无 sig),Excel 打开大概率是乱码
如果必须用 pandas.to_csv(),怎么避免乱码?
pandas 默认用 utf-8 编码,但没加 BOM,Excel 打开仍可能乱码;同时默认 line_terminator='\n',在 Windows 上显示异常。
- 显式指定
encoding='utf-8-sig'(注意不是utf_8_sig,那是旧写法) - 加
line_terminator='\r\n'保证 Windows 换行兼容 - 避免用
index=False以外的索引选项,否则可能引入不可见字符
df.to_csv('output.csv', encoding='utf-8-sig', line_terminator='\r\n', index=False)
常见错误排查点
即使写了 utf-8-sig,还是乱码或空行?先盯住这三处:
- 确认没在
open()之外再手动调用f.write('\n')或print() - 检查是否用了
csv.writer(f, lineterminator='\n')—— 这和newline=''冲突,会导致双换行 - 用记事本打开 CSV 文件,看第一行开头是否有“烫”字(BOM 显示异常),有说明编码写对了;没“烫”但 Excel 乱码,大概率是漏了
-sig
真正麻烦的不是写法,而是团队协作时有人用记事本另存为、有人用 Excel 另存、有人用 pandas 默认参数——这些操作都会悄悄破坏编码一致性。统一用 utf-8-sig + newline='' 是最省心的底线。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










