我正在使用一些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
我能做什么?谷歌似乎暗示这可能是一个被错误地保存为.csv的Excel文件。有没有办法在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字节。
发布于 2010-11-13 06:49:03
正如@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):
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()
顺便问一下,你有没有用文本编辑器看过这个文件(包括最后几行)?它真的看起来像其他(没有"NULL byte“异常)文件一样合理的CSV文件吗?
发布于 2014-11-26 17:59:57
data_initial = open("staff.csv", "rb")
data = csv.reader((line.replace('\0','') for line in data_initial), delimiter=",")
这对我很有效。
发布于 2014-02-20 08:52:49
把它理解为UTF-16也是我的问题。
下面是我的代码,它最终可以正常工作:
f=codecs.open(location,"rb","utf-16")
csvread=csv.reader(f,delimiter='\t')
csvread.next()
for row in csvread:
print row
其中location是csv文件的目录。
https://stackoverflow.com/questions/4166070
复制相似问题