Python3 csv.writer设newline=''仍现末尾引号及空行问题求助
你已经试过了newline=''这个常用方案,但行尾异常还是没解决?咱们来一步步排查和修复:
1. 先确认读写CSV的姿势是否完全正确
newline=''这个参数需要同时在读取和写入文件时都设置,而且必须配合csv.reader/csv.writer来用,不能只在一边设置。举个正确的示例:
import csv # 读取源文件的正确写法 with open('large_source.csv', 'r', newline='', encoding='utf-8') as infile: reader = csv.reader(infile) buffered_daily_data = [] for row in reader: # 这里处理单日数据缓冲逻辑 buffered_daily_data.append(row) # 写入目标文件的正确写法 with open('daily_output.csv', 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) writer.writerows(buffered_daily_data)
如果只在写入时加了newline='',读取时没设置,很可能会把源文件里的\r\n当成字段内容的一部分带进去,最后输出就会乱掉。
2. 检查源数据的换行符是否混杂
你给出的源数据行尾是\r\n,但有没有可能源文件里存在混合换行符(比如部分行是\n,部分是\r\n)?可以先读一点原始字节看看:
with open('large_source.csv', 'rb') as f: # 读取前1000字节,查看原始换行符情况 print(f.read(1000))
如果发现确实有混杂的换行符,可以在初始化csv.reader时手动指定换行符:
reader = csv.reader(infile, delimiter=',', quotechar='"', lineterminator='\r\n')
虽然csv.reader通常会自动识别换行,但遇到不标准的源文件,手动指定能避免很多坑。
3. 排查缓冲列表里的数据是否被污染
会不会在缓冲数据的过程中,把换行符当成字段的一部分保留下来了?比如源数据最后一个字段是'3\r\n',你直接把它放进了缓冲列表,那写入时就会把\r\n带到输出里,导致行尾异常。
可以在缓冲时给每个字段做个简单清洗:
cleaned_row = [field.rstrip('\r\n') for field in row] buffered_daily_data.append(cleaned_row)
这样能确保字段里的换行符被去掉,不会干扰最终的行尾格式。
4. 验证输出文件的实际换行符
有时候看起来异常可能是文本编辑器的显示问题,你可以用二进制模式打开输出文件,看看实际的换行符是什么:
with open('daily_output.csv', 'rb') as f: print(f.read(500))
如果看到输出的行尾是\r\r\n或者其他奇怪的组合,那大概率是你在写入时手动加了换行符(比如用print(row, file=outfile)或者自己拼接row + '\n')——记住,一定要用csv.writer的writerow/writerows方法写入,不要手动处理换行。
内容的提问来源于stack exchange,提问作者tommylicious

