我正在读取一个大型的csv文件
df = pd.read_csv(filename, sep=';',
encoding='cp850', quoting=3)
由于多余的分号,在某些行上我会收到错误消息
Error tokenizing data. C error:
Expected 33 fields in line 23836, saw 34
在Vim中打开文件时,大多数情况下错误恰恰在此行。但是有时不是在此行号,而是在上面的几行。
如果我手动搜索该行,则会得到一个不同的行号,这是我在编辑器中发现错误的行号。
with open(filename, encoding='cp850') as f1:
lines = f1.readlines()
[(e, l) for e, l in enumerate(lines)
if len(split(';')) == 34]
结果
[(23835, '.....
因此,在此示例中,错误不在23836行中,而是23835。
c和read_csv的python引擎都会出现此问题。
如果read_csv可以显示错误行内容和错误消息,将非常有帮助。
有没有办法做到这一点?
在导入文件的各行中似乎有换行符,并且如果将一行分为两行,则read_csv似乎接受这些行是正确的,因此在33个字段之后总会有一个换行符。但是从那一行开始,错误消息中的行数不再与文件的换行符匹配。
答案 0 :(得分:0)
有错误的行是csv文件的第23836行,在Python中枚举时索引为23835,因为Python的索引为零。
但是,错误的确切原因是什么?
如果只是几行,而最后一个 末尾包含一个或多个分号,则可以通过显式阅读前33列来轻松删除它们:
df = pd.read_csv(filename, sep=';', usecols=range(33), encoding='cp850', quoting=3)
答案 1 :(得分:0)
使用来自以下错误行23835±2行以下的匿名数据创建示例文件:
import re
bad_idx = 23835
with open(filename, 'r') as f_in, open(filename[-4:] + '_dummy.csv', 'w') as f_out:
for i, line in enumerate(f_in):
line = re.sub('[a-zA-Z0-9]+', line)
if (i > bad_idx-3) and (i < bad_idx+3) or i==0:
f_out.write(line)
打印坏行及其行号列表(从1开始):
bad_lines = []
with open(filename, 'r') as f:
n_col = len(f.readline().split(';'))
for i, line in enumerate(f):
if len(line.split(';')) != n_col:
print(i+2, line)
bad_lines.append(i+2)
print(bad_lines)