为了账号安全,请及时绑定邮箱和手机立即绑定

Python CSV错误:行包含NULL字节

/ 猿问

Python CSV错误:行包含NULL字节

Cats萌萌 2019-10-28 14:49:21

我正在使用以下代码处理一些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字节。


查看完整描述

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):

    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文件吗?


查看完整回答
反对 2019-10-28
?
拉丁的传说

将其读取为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文件的目录。


查看完整回答
反对 2019-10-28
?
临摹微笑

我也遇到了这个问题。使用Python csv模块,我试图读取在MS Excel中创建的XLS文件,NULL byte并遇到遇到的错误。我环顾四周,发现了xlrd Python模块,用于从MS Excel电子表格文件读取和格式化数据。使用该xlrd模块,我不仅能够正确读取文件,而且还可以以前所未有的方式访问文件的许多不同部分。


我认为这可能对您有帮助。


查看完整回答
反对 2019-10-28

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信