我正在尝试编写一个查看.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甚至让我达到这一点。
答案 0 :(得分:56)
我猜你在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 :(得分:56)
我通过更简单的解决方案解决了类似的问题:
import codecs
csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16'))
关键是使用编解码器模块以UTF-16编码打开文件,还有更多的编码,请检查documentation。
答案 2 :(得分:7)
如果您想假装它们不存在,您可以内联生成器来过滤掉空值。当然这是假设空字节实际上不是编码的一部分,实际上是某种错误的工件或错误。
请参阅下面的(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)
答案 3 :(得分:6)
这将告诉你问题是什么行。
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文件读取时出现此错误:“运行时错误! line包含NULL字节“。有关此错误的根本原因的任何想法吗?
...
好的,我明白了,我以为我会发布解决方案。简直造成了我 悲伤...使用的文件以.xls格式而不是.csv保存 捕获这个因为文件名本身具有.csv扩展名 类型仍然是.xls
答案 4 :(得分:5)
如果要用某些东西替换空值,可以这样做:
def fix_nulls(s):
for line in s:
yield line.replace('\0', ' ')
r = csv.reader(fix_nulls(open(...)))
答案 5 :(得分:2)
一个棘手的方法:
如果您在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
答案 6 :(得分:1)
我最近解决了这个问题,在我的实例中,它是一个压缩文件,我试图阅读。首先检查文件格式。然后检查内容是扩展名所指的内容。
答案 7 :(得分:1)
将我的Linux环境变成一个干净完整的UTF-8环境对我来说是个窍门。 在命令行中尝试以下操作:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
答案 8 :(得分:0)
pandas.read_csv现在在读取/写入时处理不同的UTF编码,因此可以直接处理空字节
data = pd.read_csv(file, encoding='utf-16')
请参阅https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
答案 9 :(得分:0)
这很简单。
不要通过“创建新的excel”来创建csv文件,也不要在窗口中另存为“ .csv”。
只需导入csv模块,编写一个虚拟csv文件,然后将数据粘贴到其中即可。
python csv模块本身制作的csv将不再显示编码或空行错误。
答案 10 :(得分:-1)
我删除了 NULL 个字节,并使用了来自终端的单线命令解决了此问题。
tr < file_with_nulls.csv -d '\000' > file_without_nulls.csv