根本解法是打开文件时传newline='':with open('data.csv', 'w', newline='') as f: writer = csv.writer(f);否则Windows下csv.writer会因换行符重复处理导致空行。

csv.writer写入时多出空行,是因为没设newline=''
Windows下用csv.writer写CSV文件,经常一行数据后面跟一个空行。这不是bug,是Python在文本模式下自动把\n转成\r\n,而csv.writer自己又加了一次换行,结果变成\r\n\r\n,显示为隔行。
根本解法是打开文件时传newline=''——注意是空字符串,不是None或'\n':
with open('data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['a', 'b'])
writer.writerow(['c', 'd'])
不加newline='',在Windows上大概率出空行;Linux/macOS可能不明显,但行为不一致,线上环境容易翻车。
为什么不能用newline='\n'或干脆不设
newline参数控制Python的换行符预处理逻辑,不是直接塞进文件的字符。设成'\n'会让Python把所有\n替换成系统默认换行符(Windows是\r\n),而csv.writer内部仍会追加一次\n,最终还是双换行。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
newline=None(默认):启用通用换行符转换,最危险,一定出空行 -
newline='\n':强制转义,和csv模块叠加快速触发重复换行 -
newline='':关闭Python层换行处理,把换行控制权完全交给csv.writer——这才是它设计的用法
用pandas.to_csv也得小心line_terminator
如果项目里用pandas写CSV,to_csv默认不会多出空行,但如果你手动改过line_terminator(比如设成'\r\n'),又在Windows下用文本编辑器打开,可能看到异常空行——因为编辑器把\r\n当一行,而pandas额外补了换行。
稳妥做法是不动line_terminator,让pandas自己决定;真要统一换行符,优先用newline=''配合底层open,而不是靠pandas参数硬调。
读取CSV时newline=''不是必须,但建议保持一致
csv.reader对空行容忍度高,读的时候不设newline=''一般不出错。但为了代码风格统一、避免团队里有人误写写入逻辑,建议读写都显式带上newline=''。
尤其当CSV由别人生成、含混合换行符(\n和\r\n混用)时,读取端设newline=''能减少意外截断或解析失败。
空行本身不是数据错误,但处理逻辑里如果用了if row:跳过空行,得确认这行是不是真为空——有些CSV空行其实是全逗号或全引号,csv.reader会返回['', '', ''],不是空列表。

















