Python(Jython2.5)处理CSV生成文件时多余空行问题求助
问题排查与修复方案
核心问题分析
你的代码出现多余空行,是两个因素叠加导致的:
- 每次循环都以追加模式打开输出文件,频繁的打开/关闭操作结合Windows换行符规则,导致换行符被重复写入;
- Python 2.x(含Jython 2.5)的
csv.writer默认会添加换行符,同时文件在文本模式下打开时,系统会自动将\n转换为\r\n,最终生成\r\r\n的双重换行,在多数编辑器中显示为空行。
具体修复步骤
1. 调整文件打开逻辑,避免循环内重复操作
把输出文件的with块移到循环外,只打开一次文件,全程复用同一个csv.writer对象:
def convertFileToIsoFormat(read_filePath, write_filePath): import csv import datetime from __future__ import with_statement with open(read_filePath) as csvfile, open(write_filePath, 'wb') as newcsv: reader = csv.reader(csvfile, delimiter='\t') writer = csv.writer(newcsv, delimiter='\t', lineterminator='\r\n') for row in reader: modifiedRow = row.copy() # 复制原列表,避免意外修改原数据(可选但更安全) columnsToModify = [4,7,11] for column in columnsToModify: modifiedRow[column] = datetime.datetime.strptime(modifiedRow[column], '%Y-%m-%d %H:%M:%S').isoformat() # 特殊格式列处理 modifiedRow[22] = datetime.datetime.strptime(modifiedRow[21], '%m/%d/%Y %H:%M:%S %p').isoformat() writer.writerow(modifiedRow) # 修正拼写错误:writewrow → writerow
2. 关键参数说明
- 用
wb二进制模式打开输出文件:Jython 2.5的文本模式会自动转换换行符,二进制模式可以规避系统的额外处理,让csv.writer完全控制换行符; - 指定
lineterminator='\r\n':强制使用Windows标准换行符,确保在不同系统的编辑器中显示一致; - 修正
writewrow拼写错误:这是明显的笔误,规范写法可避免潜在的运行问题; modifiedRow = row.copy():原代码直接赋值会修改reader返回的原列表,复制一份能避免意外副作用。
额外排查点
- 检查原CSV文件的换行符:如果原文件本身使用
\n换行,在Windows下读取时可能被识别为不完整换行,但你的代码按行读取,影响不大; - 适配Jython特性:Jython 2.5的
csv模块和CPython存在细微差异,二进制模式打开是最稳妥的规避换行符问题的方式。
内容的提问来源于stack exchange,提问作者Brian Karabinchak
相关产品推荐
相关产品推荐

