Windows与Linux读取gzip压缩CSV文件行数不一致如何解决
解决方案
问题根因
- 核心是打开gzip文件时未指定
newline=''参数,触发不同操作系统的默认换行符转换逻辑,与csv模块的处理规则冲突 - Python csv模块会自主处理符合RFC 4180规范的CSV换行(包括字段内部包裹在引号内的合法换行),要求文件对象必须关闭自动换行转换,否则会把字段内部的换行误判为行分隔符
- Windows平台默认文本模式的换行处理逻辑恰好和CSV规则适配,所以统计结果正常;Linux平台默认会把
\r、\n、\r\n都单独识别为换行符,导致字段内的换行被拆分为独立行,行数出现数倍暴涨 - 次要可能是编码参数和文件实际编码不匹配,导致乱码中出现类换行符的异常字符,被误判为行分隔符
修复代码
只需要在gz.open参数中增加newline=''即可,修改后代码如下:
with gz.open(path, 'rt', encoding='utf8', newline='') as csv_file: csv_reader = csv.reader(csv_file, delimiter=',') print(len(list(csv_reader)))
补充校验方案
如果修改后仍有少量行数偏差,可以通过校验每行字段数过滤异常行:
valid_count = 0 expect_cols = 8 # 替换为你的CSV实际列数 with gz.open(path, 'rt', encoding='utf8', newline='') as csv_file: csv_reader = csv.reader(csv_file, delimiter=',') for row in csv_reader: if len(row) == expect_cols: valid_count += 1 print(valid_count)
内容的提问来源于stack exchange,提问作者fraxton
相关产品推荐
相关产品推荐

