3 回答

TA贡献2019条经验 获得超9个赞
正如@ 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在输出(或者\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文件吗?

TA贡献1789条经验 获得超8个赞
将其读取为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文件的目录。

TA贡献1982条经验 获得超2个赞
我也遇到了这个问题。使用Python csv模块,我试图读取在MS Excel中创建的XLS文件,NULL byte并遇到遇到的错误。我环顾四周,发现了xlrd Python模块,用于从MS Excel电子表格文件读取和格式化数据。使用该xlrd模块,我不仅能够正确读取文件,而且还可以以前所未有的方式访问文件的许多不同部分。
我认为这可能对您有帮助。
添加回答
举报