CSV阅读器(Python)中“行包含NULL字节”

我试图编写一个查看.CSV文件(input.csv)的程序,并只重写以文本文件(output.txt)中列出的某个元素(corrected.csv)开始的行。

这是我的程序现在看起来像:

import csv lines = [] with open('output.txt','r') as f: for line in f.readlines(): lines.append(line[:-1]) with open('corrected.csv','w') as correct: writer = csv.writer(correct, dialect = 'excel') with open('input.csv', 'r') as mycsv: reader = csv.reader(mycsv) for row in reader: if row[0] not in lines: writer.writerow(row) 

不幸的是,我不断收到这个错误,我不知道这是什么。

 Traceback (most recent call last): File "C:\Python32\Sample Program\csvParser.py", line 12, in <module> for row in reader: _csv.Error: line contains NULL byte 

感谢这里的所有人,甚至让我到这一点。

我已经解决了一个更简单的解决scheme类似的问题:

 import codecs csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16')) 

关键是使用编解码器模块以UTF-16编码打开文件,还有更多的编码,请查看文档 。

我猜你在input.csv中有一个NUL字节。 你可以用

 if '\0' in open('input.csv').read(): print "you have null bytes in your input file" else: print "you don't" 

如果你这样做,

 reader = csv.reader(x.replace('\0', '') for x in mycsv) 

可能会让你周围的。 或者,它可能表明您在.csv文件中有utf16或“有趣”的内容。

这将告诉你什么是问题。

 import csv lines = [] with open('output.txt','r') as f: for line in f.readlines(): lines.append(line[:-1]) with open('corrected.csv','w') as correct: writer = csv.writer(correct, dialect = 'excel') with open('input.csv', 'r') as mycsv: reader = csv.reader(mycsv) try: for i, row in enumerate(reader): if row[0] not in lines: writer.writerow(row) except csv.Error: print('csv choked on line %s' % (i+1)) raise 

也许这个来自daniweb会有帮助:

从csv文件读取时遇到此错误:“运行时错误!行包含NULL字节”。 任何关于这个错误的根源的想法?

好吧,我知道了,我想我会发布解决scheme。 只是让我悲伤…使用的文件被保存在一个.xls格式,而不是.csv没有抓住这个,因为文件名本身有.csv扩展名,而types仍然是.xls

如果你想假装它们不存在,你可以直接内联一个生成器来过滤出空值。 当然,这是假设空字节不是编码的真正的一部分,真的是某种错误的工件或错误。

请参阅下面的(line.replace('\0','') for line in f) ,也可以使用模式rb打开该文件。

 import csv lines = [] with open('output.txt','r') as f: for line in f.readlines(): lines.append(line[:-1]) with open('corrected.csv','w') as correct: writer = csv.writer(correct, dialect = 'excel') with open('input.csv', 'rb') as mycsv: reader = csv.reader( (line.replace('\0','') for line in mycsv) ) for row in reader: if row[0] not in lines: writer.writerow(row) 

我最近解决了这个问题,在我的例子中,这是一个压缩的文件,我正在尝试阅读。 首先检查文件格式。 然后检查内容是什么扩展名引用。

把我的linux环境变成一个干净完整的UTF-8环境对我来说是个诀窍。 在命令行中尝试以下操作:

 export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 export LANGUAGE=en_US.UTF-8 

一个棘手的方法:

如果你在Lunux下开发,你可以使用sed的所有function:

 from subprocess import check_call, CalledProcessError PATH_TO_FILE = '/home/user/some/path/to/file.csv' try: check_call("sed -i -e 's|\\x0||g' {}".format(PATH_TO_FILE), shell=True) except CalledProcessError as err: print(err) 

对于大文件最有效的解决scheme。

检查了Python3,Kubuntu