读取7GB压缩CSV文件时遭遇UnicodeDecodeError问题求助
解决大压缩CSV读取的Unicode解码异常问题
1. 定位出错的具体数据块
既然是分块读取,直接在代码里加异常捕获,记录当前处理到的行号,把出错的块存下来分析:
import pandas as pd chunk_size = 10000 # 可根据内存情况调整块大小 file_path = "你的压缩文件路径.csv.gz" for chunk_idx, chunk in enumerate(pd.read_csv(file_path, encoding='utf-8-sig', chunksize=chunk_size)): try: # 打印进度,明确读取位置 if chunk_idx % 100 == 0: print(f"已处理 {chunk_idx * chunk_size} 行") # 这里可加入你的数据处理逻辑 except UnicodeDecodeError as e: print(f"在第 {chunk_idx * chunk_size} 行附近解码失败: {e}") # 将出错块保存为小文件,方便后续查看 chunk.to_csv(f"出错块_{chunk_idx}.csv", index=False) break
注意用utf-8-sig替代utf-8,这个编码会自动识别并跳过UTF-8-BOM的开头标记,避免用latin_1读取时出现的开头乱码问题。
2. 快速跳过或替换错误行
不想定位具体问题行的话,用pandas自带参数直接绕过去:
- 跳过有问题的行(pandas 1.3.0及以上版本支持):
pd.read_csv(file_path, encoding='utf-8-sig', chunksize=chunk_size, on_bad_lines='skip')
- 将解码失败的字节替换为占位符(如�):
pd.read_csv(file_path, encoding='utf-8-sig', chunksize=chunk_size, encoding_errors='replace')
3. 检查压缩文件完整性
你提到跳转文件末尾时工具崩溃,大概率是压缩文件本身损坏。用命令行工具验证:
- 若为gzip压缩,执行
gzip -t 你的文件名.csv.gz,报错则说明文件损坏,重新获取源文件最直接 - 若为zip压缩,执行
zip -T 你的文件名.csv.zip
4. 逐行扫描异常字节
如果上述方法无效,用底层逐行读取精准定位问题行:
import codecs with codecs.open(file_path, 'r', encoding='utf-8-sig') as f: for line_num, line in enumerate(f, 1): try: # 验证该行能否正常转换为UTF-8编码 line.encode('utf-8') except UnicodeEncodeError as e: print(f"第 {line_num} 行存在异常字节: {e}") print(f"行内容片段: {line[:100]}...") # 打印前100个字符辅助排查 break
5. 用latin_1读取后清理BOM乱码
如果只能用latin_1读取,开头的是UTF-8-BOM的三个字节解码结果,手动清理即可:
df = pd.read_csv(file_path, encoding='latin_1') # 清理列名中的BOM标记 df.columns = df.columns.str.replace('^\ufeff', '', regex=True) # 批量清理内容列中的BOM标记 for col in df.select_dtypes(include='object').columns: df[col] = df[col].str.replace('^\ufeff', '', regex=True)
注:这只是临时解决方案,建议优先找到编码异常根源,避免后续数据问题。
内容的提问来源于stack exchange,提问作者Souni
相关产品推荐
相关产品推荐

