根本原因是文件以文本模式打开时换行符被重复转换,正确做法是open时指定newline=''参数。

为什么用 csv.writer 写 CSV 会多出空行?
在 Windows 系统上用 Python 的 csv.writer 写文件时,每条记录后常出现一个空行。这不是数据问题,而是文件打开方式和换行符处理不匹配导致的:Python 默认以文本模式打开文件,而 csv.writer 在写入时会自动添加 \r\n;若文件本身又启用了通用换行(\n 被转成 \r\n),就会变成 \r\r\n,显示为双换行。
根本原因在于:没禁用文本模式的自动换行转换。
- Windows 下最典型,Linux/macOS 一般不明显
- 仅出现在用
open(..., 'w')打开文件、再传给csv.writer的场景 - 不是
csv.writer的 bug,是文件 I/O 层级的协作逻辑
正确打开文件:必须加 newline=''
解决方法极其简单——在 open() 中显式传入 newline='' 参数。这告诉 Python:别碰换行符,把换行控制权完全交给 csv.writer。
错误写法:
立即学习“Python免费学习笔记(深入)”;
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
with open('data.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['a', 'b'])
正确写法:
with open('data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['a', 'b'])
-
newline=''是唯一可靠解,其他如replace('\r\n', '\n')或手动截断都不可靠 - 该参数对所有平台都安全,Python 官方文档明确要求必须这么做
- 即使你只在 Linux 下开发,也应加上——否则迁移到 Windows 或 CI 环境就出空行
用 pandas.to_csv() 时也要留意默认行为
pandas.to_csv() 默认也会在 Windows 下产生空行,但它提供了更隐蔽的开关:line_terminator 和底层文件打开方式。
最稳妥的做法仍是手动控制文件句柄:
with open('data.csv', 'w', newline='') as f:
df.to_csv(f, index=False)
- 直接调用
df.to_csv('data.csv')仍可能出空行(尤其 pandas - 不要依赖
line_terminator='\n'单独设置——它不解决底层文本模式换行冲突 - 如果必须用字符串路径且不能改代码,可升级到 pandas ≥ 1.5,并确认环境变量
PYTHONIOENCODING未干扰
检查已有 CSV 是否被污染:看十六进制
空行问题肉眼难判断,尤其当字段含空格或末尾有 \r 时。直接用十六进制工具(如 xxd data.csv 或 VS Code 的 Hex Editor 插件)查看原始字节更准。
正常行结尾是 0d 0a(\r\n),空行多出来的是 0d 0d 0a(两个 \r)。
- 别信 Excel 预览——它会自动合并/忽略部分空白行
- 用
cat -A data.csv(Linux/macOS)或Format-Hex data.csv(PowerShell)也能快速识别 - 一旦发现
^M^M$这类重复^M,基本就是没加newline=''
newline='',或者用了第三方库(如 csvkit)内部没遵循该约定。只要涉及原生 csv 模块写文件,这个参数就得像括号一样成对出现。

















