如何使用csv.DictReader方法移除CSV文件中的NULL字节?
解决csv.DictReader读取文件时的"line contains NULL byte"错误
这个错误的根源是你的CSV文件里包含了NULL字节(\x00),而csv模块默认无法处理这种特殊字符。下面提供两种实用的解决方案,都是在DictReader处理文件前先过滤掉这些NULL字节:
方案1:逐行过滤NULL字节(适合大文件)
用生成器表达式逐行读取文件并移除NULL字节,这样不需要一次性加载整个文件,对大文件更友好:
import csv framelist = [] with open('excelfile.csv', 'r', encoding="ISO-8859-1") as file: # 生成器逐行过滤NULL字节 filtered_lines = (line.replace('\x00', '') for line in file) reader = csv.DictReader(filtered_lines, fieldnames=('BANK','IFSC', 'BRANCH', 'ADDRESS')) for row in reader: frame = { 'bank': row['BANK'], 'ifsc': row['IFSC'], 'branch': row['BRANCH'], 'address': row['ADDRESS'] } framelist.append(frame)
说明:
生成器filtered_lines会在每次读取一行内容时自动去掉其中的\x00字符,再把处理后的行传给DictReader,这样就能避免触发NULL字节的错误。
方案2:一次性清理全部内容(适合小文件)
如果你的CSV文件不大,可以一次性读取所有内容并清理NULL字节,再用StringIO模拟文件对象传给DictReader:
import csv from io import StringIO framelist = [] with open('excelfile.csv', 'r', encoding="ISO-8859-1") as file: # 读取全部内容并移除所有NULL字节 cleaned_content = file.read().replace('\x00', '') # 用StringIO把字符串转为可读取的文件对象 fake_file = StringIO(cleaned_content) reader = csv.DictReader(fake_file, fieldnames=('BANK','IFSC', 'BRANCH', 'ADDRESS')) for row in reader: frame = { 'bank': row['BANK'], 'ifsc': row['IFSC'], 'branch': row['BRANCH'], 'address': row['ADDRESS'] } framelist.append(frame)
说明:
这种方式更直观,一次性处理所有内容,但如果文件过大可能会占用较多内存,所以更适合小体积的CSV文件。
本质上,这两种方法都是在DictReader处理数据之前就把问题字符清理掉,因为csv模块本身没有内置参数来直接处理NULL字节,从输入源入手是最直接的解决思路。
内容的提问来源于stack exchange,提问作者Praveen
相关产品推荐
相关产品推荐

