Python CSV错误:行包含NULL字节
我正在处理一些CSV文件,使用下面的代码:
reader = csv.reader(open(filepath, "rU")) try: for row in reader: print 'Row read successfully!', row except csv.Error, e: sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
而一个文件正在抛出这个错误:
file my.csv, line 1: line contains NULL byte
我能做什么? 谷歌似乎build议,它可能是一个Excel文件已被保存为.csv不当。 有没有什么办法可以解决这个问题在Python?
==更新==
在下面@ JohnMachin的评论之后,我试着将这些行添加到我的脚本中:
print repr(open(filepath, 'rb').read(200)) # dump 1st 200 bytes of file data = open(filepath, 'rb').read() print data.find('\x00') print data.count('\x00')
这是我得到的输出:
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip> 8 13834
所以文件确实包含NUL字节。
正如@ S.Lott所说的,你应该以'rb'模式打开你的文件,而不是'rU'模式。 但是,这可能不会导致您目前的问题。 据我所知,如果数据中embedded了\r
,但是不会导致任何其他的电视剧,那么使用“rU”模式会让你感到困惑。 我还注意到,你有几个文件(全部用“RU”打开),但只有一个导致问题。
如果csv模块说你的文件中有一个“NULL”(愚蠢的消息,应该是“NUL”)字节,那么你需要检查你的文件中有什么。 即使使用“rb”使问题消失,我也build议您这样做。
repr()
是(或者想要成为)你的debugging朋友。 它会毫不含糊地以平台独立的方式显示你所拥有的东西(这对帮助者不知道什么是或什么是有帮助的)。 做这个:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
并仔细复制/粘贴(不要重新键入)结果到您的问题编辑(而不是注释)。
还要注意的是,如果文件在文件起始位置合理的距离内,确实是非法的,例如\ r或\ n,则reader.line_num
报告的行号将是(无帮助的)1.find第一个\x00
所在的位置(if任何)做
data = open('my.csv', 'rb').read() print data.find('\x00')
并确保您至less用repr或od转储多个字节。
data.count('\x00')
告诉你什么? 如果有很多,你可能想要做类似的事情
for i, c in enumerate(data): if c == '\x00': print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])
这样你就可以在上下文中看到NUL字节。
如果你可以在输出中看到\x00
(或者在你的od -c
输出中是\0
),那么你肯定在文件中有NUL个字节,你需要做这样的事情:
fi = open('my.csv', 'rb') data = fi.read() fi.close() fo = open('mynew.csv', 'wb') fo.write(data.replace('\x00', '')) fo.close()
顺便说一下,你是否用文本编辑器查看了文件(包括最后几行)? 它实际上看起来像一个合理的CSV文件(没有“NULL字节”exception)文件?
读它为UTF-16也是我的问题。
这是我的代码,结束了工作:
f=codecs.open(location,"rb","utf-16") csvread=csv.reader(f,delimiter='\t') csvread.next() for row in csvread: print row
其中位置是您的csv文件的目录。
我也遇到了这个问题。 使用Python的csv
模块,我试图读取MS Excel中创build的XLS文件,并运行到你得到的NULL byte
错误。 我环顾四周,find了用于从MS Excel电子表格文件中读取和格式化数据的xlrd Python模块。 使用xlrd
模块,我不仅可以正确读取文件,还可以以前所未有的方式访问文件的许多不同部分。
我认为这可能会帮助你。
将源文件的编码从UTF-16转换为UTF-8解决了我的问题。
如何在Python中将文件转换为utf-8?
import codecs BLOCKSIZE = 1048576 # or some other, desired size in bytes with codecs.open(sourceFileName, "r", "utf-16") as sourceFile: with codecs.open(targetFileName, "w", "utf-8") as targetFile: while True: contents = sourceFile.read(BLOCKSIZE) if not contents: break targetFile.write(contents)
data_initial = open("staff.csv", "rb") data = csv.reader((line.replace('\0','') for line in data_initial), delimiter=",")
这对我有用。
如果你想假装它们不存在,你可以直接内联一个生成器来过滤出空值。 当然,这是假定空字节不是真正的编码的一部分,真的是一些错误的工件或错误。
with open(filepath, "rb") as f: reader = csv.reader( (line.replace('\0','') for line in f) ) try: for row in reader: print 'Row read successfully!', row except csv.Error, e: sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
appparently它是一个XLS文件,而不是一个CSV文件http://www.garykessler.net/library/file_sigs.html确认;
我使用读取文件和分割函数的string,而不是csv阅读器:
lines = open(input_file,'rb') for line_all in lines: line=line_all.replace('\x00', '').split(";")
你为什么做这个?
reader = csv.reader(open(filepath, "rU"))
文档很清楚,你必须这样做:
with open(filepath, "rb") as src: reader= csv.reader( src )
模式必须是“rb”才能读取。
http://docs.python.org/library/csv.html#csv.reader
如果csvfile是一个文件对象,那么必须在平台上用“b”标志打开,这是有所作为的。
我得到了同样的错误。 以UTF-8保存文件,它工作。
当我使用OpenOffice Calc创buildCSV文件时,发生了这种情况。 当我在我的文本编辑器中创buildCSV文件时,即使我稍后使用Calc进行编辑,也不会发生这种情况。
我通过在我的文本编辑器中将我的Calc创build的文件中的数据复制粘贴到新的编辑器创build的文件来解决了我的问题。
我有同样的问题,打开一个Web服务产生的CSV,在空头中插入NULL字节。 我做了以下的清理文件:
with codecs.open ('my.csv', 'rb', 'utf-8') as myfile: data = myfile.read() # clean file first if dirty if data.count( '\x00' ): print 'Cleaning...' with codecs.open('my.csv.tmp', 'w', 'utf-8') as of: for line in data: of.write(line.replace('\x00', '')) shutil.move( 'my.csv.tmp', 'my.csv' ) with codecs.open ('my.csv', 'rb', 'utf-8') as myfile: myreader = csv.reader(myfile, delimiter=',') # Continue with your business logic here...
免责声明:请注意,这将覆盖您的原始数据。 确保你有它的备份副本。 你被警告了!
对于所有这些“rU”文件模式仇敌:我刚刚试图从Windows计算机上打开一个CSV文件,并使用'rb'文件模式从我的csv模块中得到这个错误:
Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
以'RU'模式打开文件正常工作。 我喜欢通用换行模式 – 它为我节省了很多麻烦。
我在使用scrapy时遇到了这个问题,并没有一个正确的中间件解压缩响应主体,然后把它交给csvreader。 因此,文件不是一个真正的csv文件,并相应地抛出line contains NULL byte
错误的line contains NULL byte
。
一种情况是 – 如果CSV文件包含空行,则可能会显示此错误。 在我们继续写或读之前检查行是必要的。
for row in csvreader: if (row): do something
我通过在代码中添加此检查来解决我的问题。