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 &lt;module&gt; 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资源(按服务和详细信息)

Python STL csv

Python中的“_csv”是啥?

如何使用 Python 解析 WordPress CSV 导出

Python - csv 阅读器 - 阅读一个样本。

python的csv阅读器可以留下引号吗?