首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python CSV错误:行包含空字节

Python CSV错误:行包含空字节
EN

Stack Overflow用户
提问于 2010-11-12 23:18:55
回答 16查看 154.6K关注 0票数 110

我正在使用一些CSV文件,代码如下:

代码语言:javascript
运行
复制
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))

有一个文件抛出了这个错误:

代码语言:javascript
运行
复制
file my.csv, line 1: line contains NULL byte

我能做什么?谷歌似乎暗示这可能是一个被错误地保存为.csv的Excel文件。有没有办法在Python中解决这个问题?

==更新==

根据@JohnMachin下面的评论,我尝试将这些行添加到我的脚本中:

代码语言:javascript
运行
复制
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')

这是我得到的输出:

代码语言:javascript
运行
复制
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834

所以这个文件确实包含NUL字节。

EN

回答 16

Stack Overflow用户

发布于 2010-11-13 06:49:03

正如@S.Lott所说,你应该在'rb‘模式打开你的文件,而不是'rU’模式。然而,这可能不会导致您当前的问题。据我所知,如果数据中嵌入了\r,使用'rU‘模式会把你搞得一团糟,但不会造成任何其他问题。我还注意到您有几个文件(都是用'rU‘打开的??)但只有一个会引起问题。

如果csv模块说您的文件中有一个"NULL“(愚蠢的消息,应该是"NUL")字节,那么您需要检查文件中的内容。我建议你这样做,即使使用'rb‘可以让问题消失。

repr()是(或想成为)您的调试朋友。它将以独立于平台的方式明确地显示您所获得的内容(这对不知道od是什么或做什么的助手很有帮助)。执行以下操作:

代码语言:javascript
运行
复制
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file

然后小心地将结果复制/粘贴(不要重复键入)到问题的编辑中(而不是注释中)。

还要注意,如果文件确实不可靠,例如在距文件开头的合理距离内没有\r或\n,则reader.line_num报告的行号将是(无用的) 1。通过执行以下操作找到第一个\x00的位置(如果有的话)

代码语言:javascript
运行
复制
data = open('my.csv', 'rb').read()
print data.find('\x00')

并确保使用repr或od至少转储那么多字节。

data.count('\x00')跟你说了什么?如果有许多,您可能想要执行以下操作

代码语言:javascript
运行
复制
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字节,您需要执行以下操作:

代码语言:javascript
运行
复制
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文件吗?

票数 114
EN

Stack Overflow用户

发布于 2014-11-26 17:59:57

代码语言:javascript
运行
复制
data_initial = open("staff.csv", "rb")
data = csv.reader((line.replace('\0','') for line in data_initial), delimiter=",")

这对我很有效。

票数 27
EN

Stack Overflow用户

发布于 2014-02-20 08:52:49

把它理解为UTF-16也是我的问题。

下面是我的代码,它最终可以正常工作:

代码语言:javascript
运行
复制
f=codecs.open(location,"rb","utf-16")
csvread=csv.reader(f,delimiter='\t')
csvread.next()
for row in csvread:
    print row

其中location是csv文件的目录。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4166070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档