【发布时间】:2021-12-17 15:31:18
【问题描述】:
我正在处理一些 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 字节。
【问题讨论】:
-
od -c说第一行是什么样的? -
我应该运行什么查询,比如 cat my.csv | od -c |更多的 ?我得到:0000000 D e p a r t m e n t F a m i l
-
CSV 是如何生成的?从 excel 中,您也许可以尝试一种方言。不然看说:stackoverflow.com/questions/2753022/…
-
谢谢。这不是我的 CSV,不幸的是我没有能力改变它。我认为它已创建为 Excel 并保存为 CSV (boo)。方言听起来是个好主意 - 我会试试看!
-
如果它实际上被保存为 CSV,它应该可以工作。我有时会发现一件事是伪装成 CSV 的 TSV(制表符分隔)文件,因此您可以尝试设置分隔符 '\t'。如果它被保存为 Excel 文件,并且扩展名更改为 CSV,则没有方言可以工作。我认为在这种情况下您唯一的选择是使用 Excel 将副本保存为正确的 CSV。