Python读取含NUL字段的CSV文件触发_csv.Error报错问题咨询
报错原因
- Python标准库的
csv模块原生不允许解析内容中包含ASCII 0值的NUL空字符,只要输入数据中存在该字符,就会直接抛出_csv.Error: line contains NUL异常。 - 外部交付的文件携带NUL字符通常是生成端的导出逻辑异常、跨系统传输时的字节错误、或者生成文件的编码与你读取时指定的编码不匹配导致的。
- 用Windows记事本打开再保存后报错消失,是因为Windows记事本在写入文件时会自动清理内容中的所有NUL空字符,重新保存后的文件已经不存在触发报错的异常字符。
解决方案
根据你的文件大小和使用场景,可以选择以下任意一种处理方案:
- 小文件快速处理:直接读取全量文件内容过滤NUL字符后再传给csv解析器,代码修改如下:
import csv from io import StringIO def csvReader(filename): with open(filename, 'r', encoding='utf-8', newline='') as f: # 替换所有NUL空字符 file_content = f.read().replace('\0', '') return csv.reader(StringIO(file_content)) for row in csvReader('test.csv'): print(row)
- 大文件低内存占用处理:逐行过滤后再解析,避免全量文件加载到内存:
import csv def csvReader(filename): with open(filename, 'r', encoding='utf-8', newline='') as f: for line in f: yield line.replace('\0', '') reader = csv.reader(csvReader('test.csv')) for row in reader: print(row)
- 高频处理脏数据场景:可以使用容错性更高的第三方数据处理库,比如pandas,无需自行处理字符过滤逻辑:
import pandas as pd # 读取时自动兼容异常字符,on_bad_lines参数可根据需求调整为跳过/警告/报错 df = pd.read_csv('test.csv', encoding='utf-8', on_bad_lines='warn') # 逐行遍历输出 for row in df.itertuples(index=False): print(list(row))
补充说明:如果过滤NUL后解析出的字段内容存在乱码,建议先确认原文件的实际编码,将
encoding参数修改为对应编码(比如gbk、utf-16)后再尝试解析,部分编码不匹配的场景也会生成异常的NUL字符。
内容的提问来源于stack exchange,提问作者Mephisto
相关产品推荐
相关产品推荐

