Python Pandas CSV导入“错误标记数据”-显示错误行内容

时间:2018-11-27 11:07:53

标签: python pandas csv

我正在读取一个大型的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个字段之后总会有一个换行符。但是从那一行开始,错误消息中的行数不再与文件的换行符匹配。

2 个答案:

答案 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)