我尝试使用以下格式的代码读取csv文件。
def csv_dict_reader(file_obj):
reader = csv.reader(file_obj, delimiter=',')
for row in reader:
# some operation
file = open("data.csv", "r")
csv_dict_reader(file)
我已经提到了here给出的解决方案,但它们似乎都不起作用。可能是最可能的原因。
错误:
for row in reader:
_csv.Error: line contains NULL byte
答案 0 :(得分:1)
该文件包含一个或多个与CSV读取器不兼容的NULL字节。作为一种解决方法,您可以在一段时间内读取文件,如果检测到NULL字节,则将其替换为空格字符。然后,可以通过CSV读取器通过将结果字符串转换为类似对象的文件来解析生成的行。请注意,默认情况下的分隔符为,
,因此不需要指定。通过添加enumerate()
,您可以显示文件中的哪些行包含NULL字节。
当您使用DictReader()
时,需要额外的步骤才能使用普通csv.reader()
从文件中提取标头。此行可用于手动指定fieldnames
的{{1}}参数。
DictReader
最后,当使用import csv
import StringIO
with open('data.csv', 'rb') as f_input:
# Use a normal CSV reader to get the header line
header = next(csv.reader(f_input))
for line_number, raw_line in enumerate(f_input, start=1):
if '\x00' in raw_line:
print "Line {} - NULL found".format(line_number)
raw_line = raw_line.replace('\x00', ' ')
row = next(csv.DictReader(StringIO.StringIO(raw_line), fieldnames=header))
print row
时,您应该以二进制模式打开文件,例如csv.reader()
。