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