CSV读取器中出现"行包含NULL字节"(Python)

105 投票
15 回答
174254 浏览
提问于 2025-04-17 04:59

我正在尝试写一个程序,这个程序会读取一个 .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

感谢所有在 这里 帮助我的人,让我能走到这一步。

15 个回答

25

如果你想把空值(null)替换成其他东西,可以这样做:

def fix_nulls(s):
    for line in s:
        yield line.replace('\0', ' ')

r = csv.reader(fix_nulls(open(...)))
89

我猜你的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编码或者其他一些“有趣”的东西。

82

我用一个更简单的方法解决了一个类似的问题:

import codecs
csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16'))

关键是使用codecs模块来以UTF-16编码打开文件,实际上还有很多其他的编码方式,具体可以查看文档

撰写回答