使用 csv.writer 写入文件时出现多余空行,根本原因是未显式指定 newline='' 参数,导致在 Windows 等系统下换行符被双重处理(\r\n + \n),引发行间空行。
使用 `csv.writer` 写入文件时出现多余空行,根本原因是未显式指定 `newline=''` 参数,导致在 windows 等系统下换行符被双重处理(`\r\n` + `\n`),引发行间空行。
在 Python 中通过 csv 模块写入 CSV 文件时,看似简单的代码却常因一个易被忽略的细节——文件打开模式中的 newline 参数——导致输出格式异常。典型表现为:每条记录后多出一行空白,CSV 文件呈现“隔行显示”效果(如字段行与首数据行之间、各数据行之间均含空行)。这并非 CSV 标准要求,也非数据本身问题,而是 Python I/O 层与 CSV 模块协同机制所致。
核心原因解析:
Python 的 csv.writer 在内部会自行添加行终止符(默认为 \r\n)。但若文件以文本模式('w')打开而未设置 newline='',Python 的通用换行符转换机制会再次将 \n 转换为平台默认换行符(Windows 下为 \r\n),最终导致实际写入 '\r\n\r\n',从而产生视觉上的空行。该行为在 Windows 上最显著,在 Linux/macOS 上因换行符为 \n 而影响较小,但仍属不一致隐患。
正确写法:显式传入 newline=''
必须在 open() 中指定 newline=''(空字符串),禁用 Python 的自动换行符转换,将换行控制权完全交由 csv.writer 处理:
import csv
fields = ['Name', 'Branch', 'Year', 'CGPA']
rows = [
['Nikhil', 'COE', '2', '9.0'],
['Sanchit', 'COE', '2', '9.1'],
['Aditya', 'IT', '2', '9.3'],
['Sagar', 'SE', '1', '9.5'],
['Prateek', 'MCE', '3', '7.8'],
['Sahil', 'EP', '2', '9.1']
]
# ✅ 正确:指定 newline=''
with open('Test.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(fields)
writer.writerows(rows)注意事项与最佳实践:
- newline='' 是 强制性要求,适用于所有使用 csv.writer 或 csv.DictWriter 的文本写入场景;
- 该参数仅对文本模式('w', 'a')有效,二进制模式('wb')无需设置,但 CSV 操作应始终使用文本模式;
- 若省略此参数,代码在不同操作系统上行为不一致,损害可移植性;
- 即使数据源来自链表、数据库或 API,只要最终通过 csv.writer 输出,都需遵守此规范。
遵循这一准则,即可确保 CSV 输出紧凑、标准兼容,并避免后续数据清洗或导入时因意外空行引发的解析错误。










