使用pandas的read_csv和nrows功能来读取约13000行CSV文件的部分内容。

10 浏览
0 Comments

使用pandas的read_csv和nrows功能来读取约13000行CSV文件的部分内容。

我正在尝试将CSV文件的片段读入pandas DataFrame中,但当我将nrows设置为超过一定点时遇到了麻烦。我的CSV文件被分成了不同的段落,每个段落有不同的标题/数据类型,所以我已经浏览了文件并保存了不同段落的行号。当我尝试执行以下操作时:\n

pd.io.parsers.read_csv('filename',skiprows=40, nrows=12646)

\n它工作得很好。如果再多一些行,就会出现错误:\n

CParserError: Error tokenizing data. C error: Expected 56 fields in line 13897, saw 71

\n确实,第13897行有那么多列,这就是为什么我要使用nrows和skiprows。我可以找到pandas将读取的最后一行,它看起来与其他行没有任何不同。在十六进制编辑器中查看文件时,我仍然看不到任何不同之处。\n我还尝试了另一个CSV文件,结果也类似:\n

pd.io.parsers.read_csv('file2',skiprows=112, nrows=18524)

Int64Index: 18188 entries, 0 to 18187

\n但是:\n

pd.io.parsers.read_csv('file2',skiprows=112, nrows=18525)

\n会得到:\n

CParserError: Error tokenizing data. C error: Expected 56 fields in line 19190, saw 71

\n我是否遗漏了什么?还有其他方法可以解决这个问题吗?\n我使用的是Windows上的 pandas-0.10.1.win-amd64-py3.3numpy-MKL-1.7.1rc1.win-amd64-py3.3python-3.3.0.amd64。我在使用 numpy-unoptimized-1.7.1rc1.win-amd64-py3.3 时也遇到了同样的问题。

0
0 Comments

问题的原因是在使用pandas的read_csv函数读取CSV文件时,使用了nrows参数限制读取的行数,但是文件中存在有问题的行,导致读取出错。解决方法是通过使用warn_bad_lines和error_bad_lines参数来关闭错误和警告信息,从而成功读取文件。

具体的解决方法如下:

import pandas as pd
from StringIO import StringIO
# 创建一个包含有问题行的CSV文件数据
data = StringIO("""a,b,c
1,2,3
4,5,6
6,7,8,9
1,2,5
3,4,5""")
# 使用read_csv函数读取CSV文件,关闭错误和警告信息
df = pd.read_csv(data, warn_bad_lines=False, error_bad_lines=False)

以上代码中,先创建了一个包含有问题行的CSV文件数据,然后使用read_csv函数读取该数据,并通过设置warn_bad_lines和error_bad_lines参数为False来关闭错误和警告信息。这样就可以成功读取CSV文件并将数据存储在DataFrame中。

虽然通过使用StringIO缓冲区的方法可以解决问题,但仍然不清楚为什么会出现错误。实际上,pd.read_csv可以正确读取相同数据的StringIO对象(没有使用bad_lines标志),但在使用nrows和skiprows参数限制读取行数时,会导致错误的出现。

0