根本原因是open()打开文件时未指定newline='',导致文本模式I/O与csv.writer换行符处理冲突,在Windows下产生\r\n\r\n空行;正确做法是始终使用open('file.csv', 'w', newline='')。

根本原因不是数据本身有问题,而是 open() 打开文件时没加 newline='',导致换行符被重复写入。Windows 下尤其明显,但跨平台部署时也必须统一处理。
为什么 csv.writer 会多出空行?
这不是 csv.writer 的 bug,是 Python 文本模式 I/O 和 CSV 模块协同失配的结果:
-
csv.writer写每行时,内部已自动添加\r\n(Windows)或\n(Linux/macOS) - 但若用
open('file.csv', 'w')默认打开,Python 文本模式会再把\n转成系统换行符——在 Windows 上就是又加了一次\r\n - 最终写入的是
\r\n\r\n,记事本、Excel 等工具就显示为空行 - Linux/macOS 看不出明显空行,是因为
\n\n仍只算一个视觉空行,但字节层面已污染,且迁移到 Windows 或 CI 环境立刻暴露
正确写法:必须加 newline=''
这是唯一官方推荐、全平台安全、一劳永逸的解法:
- 始终用
open('data.csv', 'w', newline='') as f,不能省略newline='' -
newline=''不是newline=None,也不是newline='\n';它明确告诉 Python:“别碰换行符,交给 csv 模块” - 对
csv.writer和csv.DictWriter都适用,漏掉任何一个都会出空行 - 即使你只在 Linux 开发,也得加——CI 服务器、同事的 Windows 机器、客户环境都可能崩
用 pandas.to_csv() 也要小心
pandas.to_csv() 默认行为同样受底层文件打开方式影响,不能盲目信任:
立即学习“Python免费学习笔记(深入)”;
- 直接调用
df.to_csv('out.csv')仍可能出空行(尤其旧版 pandas) - 最稳妥的是手动控制句柄:
with open('out.csv', 'w', newline='') as f: df.to_csv(f, index=False) - 不要只靠
line_terminator='\n',它不解决文本模式换行转换冲突,纯属掩耳盗铃 - 如果必须用路径字符串且无法改代码,确认 pandas ≥ 1.5,并检查
PYTHONIOENCODING环境变量未干扰
怎么验证空行问题是否真解决了?
别信记事本——它对 \r\r\n 渲染不可靠:
- 用 VS Code 或 Notepad++ 打开,开启“显示所有字符”,看行尾是不是单个
CRLF - 命令行查十六进制:
hexdump -C out.csv | head,确认每行结尾是0d 0a(即\r\n),而不是0d 0d 0a - 写完立刻用
csv.reader读一遍:list(reader)里不该出现[]或['']这样的空行
真正容易被忽略的,是封装成工具函数后忘了传 newline='',或者多人协作时有人删掉了这行参数——它不报错,只悄悄污染输出。只要和 csv 或 pandas.to_csv() 打交道,newline='' 就是铁律,没有例外。


















