CSV阅读器(Python)中的“行包含NULL字节”
Posted
技术标签:
【中文标题】CSV阅读器(Python)中的“行包含NULL字节”【英文标题】:"Line contains NULL byte" in CSV reader (Python) 【发布时间】:2011-12-15 05:49:33 【问题描述】:我正在尝试编写一个查看 .CSV 文件 (input.csv) 并仅重写以某个元素 (corrected.csv) 开头的行的程序,如文本文件 (output.txt )。
这是我的程序现在的样子:
import csv
lines = []
with open('output.txt','r') as f:
for line in f.readlines():
lines.append(line[:-1])
with open('corrected.csv','w') as correct:
writer = csv.writer(correct, dialect = 'excel')
with open('input.csv', 'r') as mycsv:
reader = csv.reader(mycsv)
for row in reader:
if row[0] not in lines:
writer.writerow(row)
不幸的是,我不断收到此错误,我不知道它是关于什么的。
Traceback (most recent call last):
File "C:\Python32\Sample Program\csvParser.py", line 12, in <module>
for row in reader:
_csv.Error: line contains NULL byte
感谢所有here 的人,甚至让我走到了这一步。
【问题讨论】:
只是一个猜测,但听起来您的 input.csv 文件包含一个空行(最后是 mebe?)。尝试在 csvParser.py 文件中查找该异常文本。 我实际上只是浏览了 input.csv 文件并删除了所有空格......仍然没有运气(同样的错误)。 为了查明行号,我建议你引入一个计数器变量并在for row in reader
循环内递增它。
当程序本身无法执行时,我不确定我应该怎么做。我尝试添加一个计数器,但没有出现任何不同,只是相同的回溯错误。
您的 .csv 文件中有 NULL 字节吗?如果你这样做,open('input.csv').read().index('\0')
会给你第一个的偏移量。
【参考方案1】:
我用更简单的方法解决了一个类似的问题:
import codecs
csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16'))
关键是使用编解码器模块打开UTF-16编码的文件,还有很多编码,查看documentation。
【讨论】:
我在使用 LibreOffice 创建的 CSV 文件时遇到了同样的问题,该文件最初是从 Excel .xls 文件打开的。出于某种原因,LibreOffice 已将 CSV 文件保存为 UTF-16。您可以通过查看文件的前 2 个字节来判断,如果它是 FF FE,那么它是 UTF-16 的一个很好的指标 请注意,如果您的文件包含 ASCII 范围之外的 UTF-16 数据,csv.reader()
将无法处理它,您将得到 @987654324 @s 代替。
这只是引发了另一个错误,UnicodeError: UTF-16 stream does not start with BOM
在我的例子中是'utf-16le'
。
在我的情况下它是 utf-8,这没有帮助【参考方案2】:
我猜你在 input.csv 中有一个 NUL 字节。您可以使用
进行测试if '\0' in open('input.csv').read():
print "you have null bytes in your input file"
else:
print "you don't"
如果你这样做,
reader = csv.reader(x.replace('\0', '') for x in mycsv)
可能会帮助您解决这个问题。或者它可能表明您在 .csv 文件中有 utf16 或“有趣”的内容。
【讨论】:
+1 在文件中找到 NULL 字节...不幸的是现在我的“corrected.csv”文件现在用日语读取... 听起来你的 .csv 不在 ascii 中。我认为进一步的帮助需要更多关于 .csv 实际内容的信息。您是否尝试过在 vim 或记事本等文本编辑器中打开它?还是运行file input.csv
来识别文件类型?
我在记事本中打开了它,看起来还不错。 csv 应该是什么样的?它的读取方式与在 Google Analytics 上的读取方式相同,但数据之间有巨大的标签。
该死的......有没有办法用逗号替换选项卡并让它与Python程序一起使用?
如果您的 csv 是制表符分隔的,您需要指定:reader = csv.reader(mycsv, delimiter='\t')
。我想象 csv 阅读器正在吞噬你的整个文件,寻找逗号并一直到 EOF。但是你肯定有编码问题。打开文件时需要指定编码。【参考方案3】:
如果你想用一些东西替换空值,你可以这样做:
def fix_nulls(s):
for line in s:
yield line.replace('\0', ' ')
r = csv.reader(fix_nulls(open(...)))
【讨论】:
用空格代替 null 不是一个好的选择。为我工作以替换为空字符串 我有一个关于您如何使用产量的问题。鉴于这是在一个循环中,这是否意味着它仍然会逐行读取文件还是会立即将其加载到内存中?【参考方案4】:如果你想假装它们不存在,你可以只内联一个生成器来过滤掉空值。当然,这是假设空字节并不是真正的编码的一部分,并且确实是某种错误的工件或错误。
请参阅下面的(line.replace('\0','') for line in f)
,您可能还想使用模式rb
打开该文件。
import csv
lines = []
with open('output.txt','r') as f:
for line in f.readlines():
lines.append(line[:-1])
with open('corrected.csv','w') as correct:
writer = csv.writer(correct, dialect = 'excel')
with open('input.csv', 'rb') as mycsv:
reader = csv.reader( (line.replace('\0','') for line in mycsv) )
for row in reader:
if row[0] not in lines:
writer.writerow(row)
【讨论】:
谢谢!这适用于 NC 选举结果文件,它确实(!)在一列中使用空字节代替“0”字节。见dl.ncsbe.gov/ENRS/resultsPCT20161108.zip【参考方案5】:这将告诉您问题所在。
import csv
lines = []
with open('output.txt','r') as f:
for line in f.readlines():
lines.append(line[:-1])
with open('corrected.csv','w') as correct:
writer = csv.writer(correct, dialect = 'excel')
with open('input.csv', 'r') as mycsv:
reader = csv.reader(mycsv)
try:
for i, row in enumerate(reader):
if row[0] not in lines:
writer.writerow(row)
except csv.Error:
print('csv choked on line %s' % (i+1))
raise
也许来自 daniweb 的 this 会有所帮助:
从 csv 文件读取时出现此错误:“运行时错误! 行包含 NULL 字节”。有关此错误的根本原因的任何想法?
...
好的,我明白了,我想我会发布解决方案。简直让我 悲伤... 用过的文件以 .xls 格式保存,而不是 .csv 没有 抓住这一点,因为文件名本身具有 .csv 扩展名,而 类型仍然是 .xls
【讨论】:
Traceback (most recent call last): File "C:\Python32\Sample Program\csvParser.py", line 17, in <module> print ('csv choked on line %s' % (i+1)) NameError: name 'i' is not defined
好的。然后它在第一行就窒息了。运行这个并发布你看到的内容:print(open('input.csv', 'r').readlines()[0])
一些时髦的东西......但它正在运行。 ÿþ/
也许您的 csv 并不是真正的 csv。请参阅我答案的后半部分。
哦,这可能完全是这样,我该如何解决这个问题?我也直接从 Google Analytics 中保存了它...【参考方案6】:
一个棘手的方法:
如果你在Lunux下开发,你可以使用sed的所有力量:
from subprocess import check_call, CalledProcessError
PATH_TO_FILE = '/home/user/some/path/to/file.csv'
try:
check_call("sed -i -e 's|\\x0||g' ".format(PATH_TO_FILE), shell=True)
except CalledProcessError as err:
print(err)
大文件最有效的解决方案。
检查了 Python3、Kubuntu
【讨论】:
【参考方案7】:我最近解决了这个问题,在我的例子中,它是一个我试图读取的压缩文件。首先检查文件格式。然后检查内容是否是扩展名所指的内容。
【讨论】:
【参考方案8】:将我的 linux 环境变成一个干净完整的 UTF-8 环境对我来说是个窍门。 在命令行中尝试以下操作:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
【讨论】:
对我来说也改成 UTF-8 解决了这个问题。在 Windows 上,我使用 Notepad++ 将格式从 UTF16 更改为 UTF8。然后我用 libreoffice calc 打开了文件,并清除了多余的行等。【参考方案9】:这早就解决了,但我遇到了这个答案,因为我在读取 CSV 以在 Keras 和 TensorFlow 中将其作为训练数据处理时遇到了意外错误。
就我而言,问题要简单得多,值得引起注意。生成到 CSV 中的数据不一致,导致某些列完全丢失,这似乎最终也会引发此错误。
教训:如果您看到此错误,请验证您的数据是否与您认为的一样!
【讨论】:
【参考方案10】:pandas.read_csv 现在在读/写时处理不同的 UTF 编码,因此可以直接处理 null 字节
data = pd.read_csv(file, encoding='utf-16')
见https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
【讨论】:
【参考方案11】:很简单。
不要通过“创建新的 excel”来制作 csv 文件或从窗口另存为“.csv”。
只需导入 csv 模块,编写一个虚拟 csv 文件,然后将数据粘贴到其中。
python csv 模块本身制作的csv 将不再显示编码或空行错误。
【讨论】:
这个答案没有提供任何关于如何操作输入数据的解决方案,而是如何“修复”输入数据。通常情况下,输入数据是不可管理的。以上是关于CSV阅读器(Python)中的“行包含NULL字节”的主要内容,如果未能解决你的问题,请参考以下文章
python 使用Python中的CSV阅读器报告未标记的AWS资源(按服务和详细信息)