【发布时间】:2018-11-28 05:59:32
【问题描述】:
我正在读取一个大的 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 行。
read_csv的c和python引擎都会出现这个问题。
如果 read_csv 可以在错误消息中显示错误行内容将非常有帮助。
有没有办法做到这一点?
更新:
导入文件的行内似乎有换行符,如果一行被分成两行,read_csv 似乎接受这些行是正确的,因此在 33 个字段之后总是有一个换行符。但是从该行开始,错误消息中的行数不再匹配文件的换行符。
【问题讨论】:
-
当您的标头长度小于某行中的值数时,此错误很常见。主要是由不适当的分隔符引起的
-
它不会告诉您带有意外字段编号的行吗?
Expected 33 fields in line 23836, saw 34这就是你发布的内容。 -
@SpghttCd 在这种情况下,错误是上面的一行。我的示例代码解释了这一点。此外,这不是由标题引起的,而是由文件组合了额外的分号和一些不属于的换行符引起的,我需要清理它们。这很难,因为我无法相信错误消息中的行号。
-
您是否愿意在读取时忽略错误,然后在获得
DataFrame后过滤掉出现错误的行? -
不,我想查看错误并停止导入,但查看错误所在的行,以便修复并重新启动导入。