Python读取CSV时CParserError与NULL byte错误的编码排查
本文记录Python中读取CSV文件时常见的两个错误:CParserError提示字段数不匹配以及line contains NULL byte。通过对比直接修改后缀与“另存为”不同编码格式的操作,分析发现Excel另存为ANSI编码可解决此类解析问题。同时提供了csv模块与pandas模块对应的修正代码示例,供遇到类似编码导致解析失败的场景参考。
Python编码格式导致CSV读取错误
本文记录笔者在Python开发中遇到的两个典型问题,分别涉及csv模块和pandas库的CSV读取操作:
pandas模块报错“CParserError: Error tokenizing data. C error: Expected 1 fields in line 4, saw 2”
csv模块报错“line contains NULL byte”
今日处理数据时疏忽了细节,且为了省事将数据复制到Excel中保存后,直接修改文件后缀名为.csv以准备读取。随后在运行算法读取数据时,果然出现了上述错误。
import pandas as pd
path = 'water30.csv'
df=pd.read_csv(path)注:后两行代码可简化为df=pd.read_csv('water30.csv')。
但由于read_csv函数本身包含众多参数(尽管此处未使用),故保留path变量写法更为规范。
这样操作会报错CParserError: Error tokenizing data. C error: Expected 1 fields in line 4, saw 2
我在网上查阅了多种解决办法,由于read_csv的参数繁多,各方案说法不一,我遇到的情况可能只是其中之一,久寻无果。直到看到有人分析模块_csv.c的代码后指出,文件中不能包含“\0”字符,因此CSV文件不应是Unicode编码,而应是ANSI编码。
针对我直接修改后缀名的操作,点击该.csv文件打开时系统已提示:

这说明单纯更改后缀名并未真正改变文件格式。因此我选择“另存为”,并将文件格式选为:

之后,读取操作便不再报错。
注:此处有一个未解疑问,即那个“直接修改后缀得到的.csv”文件,我用记事本打开查看编码显示为ANSI。因此我不明白为何仍会报错……不过问题暂时得到了解决。
现在读取到的数据格式为:

这是一个结构体对象。
另外,对于csv模块出现的“line contains NULL byte”错误,其出现原因和解决方案与上述情况一致。例如:
import csv
csvfile=file('water30.csv','rb')
reader = csv.reader(csvfile)
for line in reader:
print line
csvfile.close()报错信息:Error: line contains NULL byte
修正后,读入的数据格式为list列表,如下所示:
[‘1’, ‘2’, ‘2’, ‘1’, ‘2’] [‘1’, ‘1’, ‘1’, ‘2’, ‘2’] [‘1’, ‘2’, ‘1’, ‘1’, ‘1’] [‘1’, ‘1’, ‘1’, ‘1’, ‘2’] [‘1’, ‘1’, ‘1’, ‘2’, ‘2’] [‘1’, ‘1’, ‘1’, ‘2’, ‘2’] [‘0.697’, ‘0.744’, ‘0.634’, ‘0.403’, ‘0.481’] [‘0.46’, ‘0.376’, ‘0.264’, ‘0.237’, ‘0.149’] [‘1’, ‘1’, ‘1’, ‘1’, ‘1’]
pandas读取CSV常见错误及解决
1)第一种错误
错误提示:
pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 121, saw 2
解决方法:
import pandas as pd
data = pd.read_csv(inputfile, encoding='utf-8',header=None,sep = '\t')2)第二种错误
错误提示:
pandas.errors.ParserError: Error tokenizing data. C error: EOF inside string starting at line 15945
解决方法:
import pandas as pd
import csv
df = pd.read_csv(csvfile, quoting=csv.QUOTE_NONE, encoding='utf-8')以上为个人经验总结,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









