【发布时间】:2017-06-21 08:22:36
【问题描述】:
我正在尝试使用 panda 包读取一个大的 tsv 文件。 tsv 是从一个 zip 文件中提取的,该文件分别包含标题名称。它不是我写的——我从外部来源获得了这个文件(它是点击流数据)。我在一个亚马逊虚拟实例上通过 jupyter notebook 运行它。
我的代码如下:
df = pd.read_csv(zf.open(item[:-4]),
compression = None,
sep = '\t',
parse_dates = True,
names = df_headers,
usecols = columns_to_include,
error_bad_lines = False)
df_headers 是在单独的 tsv 上提供的 680 个字段。 我的问题是我得到了数百个类型的错误:
跳过第 158548 行:预期 680 个字段,看到 865 个
跳线 181906:预期 680 个字段,看到 865 个
跳线 306190:预期 680 个字段,看到 689 个 跳线 306191:预计 680 个字段,看到 686 个
跳过第 469427 行:预期 680 个字段,看到 1191
跳过第 604104 行:预期 680 个字段,看到 865 个
然后操作停止,并带有以下 Traceback
raise ValueError('skip_footer 不支持迭代')
然后: pandas/parser.pyx 在 pandas.parser.TextReader.read (pandas/parser.c:7988)()
pandas/parser.pyx in pandas.parser.TextReader._read_low_memory (pandas/parser.c:8244)()
pandas/parser.pyx in pandas.parser.TextReader._read_rows (pandas/parser.c:9261)()
pandas/parser.pyx in pandas.parser.TextReader._convert_column_data (pandas/parser.c:10190)()
CParserError:指定的列过多:预期为 680,但发现为 489
这不是我以这种方式读取的第一个文件 - 我读取了很多文件,但通常得到少于 10 个这样的错误,我可以忽略并读取文件。我不知道为什么这次有问题的行数如此之多,以及为什么阅读会停止。 我该如何进行?我什至无法打开 tsv,因为它们很大,当我尝试使用其中一种应该能够打开大文件的工具时 - 我找不到错误的行,因为行号不是类似于错误中报告的那些......(即我不能只是去第 158548 行看看那里有什么问题......) 任何帮助将不胜感激!这对我来说非常重要。
已编辑: 当我在没有 usecols 选项的情况下运行 read_csv 时(我只在大文件的一个子集上尝试过) - 它成功了。出于某种原因,usecols 导致 pandas 识别真实列的一些问题......我将 pandas 版本更新到 0.19.2,因为我看到有一些关于 usecols 选项的错误修复,但现在我有一个更糟糕的问题 -当我对文件的一个子集运行读取时(使用 nrows=),无论是否使用 usecols,我都会得到不同的结果:使用 usecols 我会收到以下错误:
CParserError:标记数据时出错。 C 错误:捕获缓冲区溢出 - 可能是格式错误的输入文件。
现在我什至不知道在哪一行...
如果我在没有 usecols 的情况下运行它,我设法读取但 - 我设法只为数据的子集(约 700000 行中的 200000 行)执行它 - 当我尝试每次读取 200000 行时,然后附加创建数据框我遇到内存问题错误.....
usecols 列数在 100 左右,总列数接近 700。我有几十个这样的文件,每个文件大约有 700000 行。
【问题讨论】:
-
这可能意味着这些行上的某些字段包含逗号,因此解析器将它们视为附加的分隔符标记。您应该检查文件格式是否正确,或者您是否没有忘记 read_csv 上的参数,例如引用参数
-
谢谢!任何建议如何查看文件? excel太大打不开...
-
我的小猪是
print(open('sickfile.tsv).readlines()[158548])) -
试试广义的
pd.read_table,而不是pd.read_csv。 -
谢谢,@Parfait,Boud,这些都不起作用...我编辑了问题 - usecols 选项存在一些问题