根本原因是Windows默认用\r\n换行,而csv.writer在文本模式下会与Python的换行符转换机制叠加,导致写入\r\n\r\n,显示为空行;解决方法是必须使用newline=''打开文件,禁用Python层换行处理,交由csv.writer自主控制。

为什么 csv.writer 在 Windows 上会多出空行?
根本原因是 Windows 默认用 \r\n 换行,而 csv.writer 写入时若文件以文本模式(默认)打开,Python 会在已含 \r\n 的行尾再次添加换行符,导致每行后出现一个空行。
这在 Linux/macOS 上不明显,因为它们只用 \n;但在 Windows 记事本里,\r\r\n 会被显示为两行。
解决方法:用 newline='' 打开文件
这是最直接、官方推荐的做法——告诉 Python 不要对换行符做任何额外处理,让 csv.writer 自己控制输出。
- 必须以文本模式(
'w')打开文件,但显式传入newline='' - 不能用二进制模式(
'wb'),否则csv.writer会报错:TypeError: a bytes-like object is required, not 'str' -
newline=''是关键,不是newline=None或省略
import csv
with open('output.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['name', 'age'])
writer.writerow(['Alice', 30])
writer.writerow(['Bob', 25])
如果用 csv.DictWriter,同样要加 newline=''
DictWriter 行为一致,漏掉 newline='' 同样产生空行,且容易被忽略,因为它看起来更“高级”。
立即学习“Python免费学习笔记(深入)”;
- 字段名顺序、
fieldnames参数本身不影响空行,问题只出在文件打开方式 - 即使指定了
lineterminator='\n',也不解决根本问题——底层仍受文本模式换行转换干扰 - 务必检查是否所有
open()调用都带newline='',尤其封装成函数复用时
with open('data.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['id', 'value'])
writer.writeheader()
writer.writerow({'id': 1, 'value': 'foo'})
其他常见误操作与验证建议
有人尝试用 .replace('\r\n', '\n') 后处理,或改用 open(..., 'wb') + encode(),这些都会引入编码/类型错误,不推荐。
- 用记事本看 CSV 是否“多空行”不可靠——改用 VS Code、Notepad++ 或
hexdump -C output.csv | head查看实际字节,确认结尾是单个0d 0a(即\r\n),而非0d 0d 0a - 在脚本中写完立即用
csv.reader读回来验证:若读到空行(如['']),说明没生效 - 跨平台部署时,这个参数必须保留——它在 Linux/macOS 下也完全安全,不会引发问题
真正容易被忽略的,是团队协作中有人改了文件打开逻辑却没同步更新 newline='',结果本地测试正常,CI 或 Windows 用户一跑就出空行。每次动到 CSV 写入,先扫一眼 open() 参数。

















