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

我能做什么?Google似乎建议它可能是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字节。


Cats萌萌
浏览 1046回答 3
3回答

慕少森

正如@ S.Lott所说,您应该以“ rb”模式而不是“ rU”模式打开文件。但是,这可能不会引起您当前的问题。据我所知,如果\r数据中嵌入了“ rU”模式,则会使您大失所望,但不会引起任何其他麻烦。我还注意到您有几个文件(全部以'rU'??打开),但只有一个会引起问题。如果csv模块说您的文件中有一个“ NULL”(愚蠢的消息,应为“ NUL”)字节,那么您需要检查文件中的内容。即使使用'rb'可以使问题消失,我还是建议您这样做。repr()是(或想成为)调试朋友。它会以独立于平台的方式明确显示您所拥有的内容(这对不知道od是什么或做什么的帮助者很有帮助)。做这个:print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file并仔细地将结果复制/粘贴(请勿重新输入)以编辑您的问题(而不是评论)。还要注意,如果文件确实很模糊,例如距文件开头的合理距离内没有\ r或\ n,则报告的行号reader.line_num将(无益)1. \x00通过执行以下操作查找第一个行(如果有)data = open('my.csv', 'rb').read()print data.find('\x00')并确保至少使用repr或od转储那么多字节。是什么data.count('\x00')告诉你吗?如果有很多,您可能想要做类似的事情for i, c in enumerate(data):&nbsp; &nbsp; if c == '\x00':&nbsp; &nbsp; &nbsp; &nbsp; print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])这样您就可以在上下文中看到NUL字节。如果你可以看到\x00在输出(或者\0在你的od -c输出),那么你肯定有在文件中NULL字节(S),你需要做这样的事情:fi = open('my.csv', 'rb')data = fi.read()fi.close()fo = open('mynew.csv', 'wb')fo.write(data.replace('\x00', ''))fo.close()顺便说一句,您是否使用文本编辑器查看了文件(包括最后几行)?它实际上看起来像其他文件(没有“ NULL字节”例外)一样合理的CSV文件吗?

拉丁的传说

将其读取为UTF-16也是我的问题。这是我的代码,最终起作用了:f=codecs.open(location,"rb","utf-16")csvread=csv.reader(f,delimiter='\t')csvread.next()for row in csvread:&nbsp; &nbsp; print row其中location是您的csv文件的目录。

临摹微笑

我也遇到了这个问题。使用Python csv模块,我试图读取在MS Excel中创建的XLS文件,NULL byte并遇到遇到的错误。我环顾四周,发现了xlrd Python模块,用于从MS Excel电子表格文件读取和格式化数据。使用该xlrd模块,我不仅能够正确读取文件,而且还可以以前所未有的方式访问文件的许多不同部分。我认为这可能对您有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python