为什么pandas read_csv没有读取正确的行数?

时间:2014-09-23 02:11:23

标签: python csv pandas

我正在尝试使用pandas read_csv打开部分csv文件。我打开的部分在第746行有一个标题,然后转到第1120行。

 gr = read_csv(inputfile,header=746,nrows=374,index_col=False)

然后我收到错误

CParserError: Error tokenizing data. C error: Expected 9 fields in line 1121, saw 17

错误是有道理的,因为在文件的第1121行,数据从9个字段变为17.没有意义的是为什么它试图读取第1121行,因为nrows和header应该只打开行直到1120年。

我可以通过将行数减少到232以下来使其工作。即使我增加标题号以使其在文件中向下开始(例如将其增加到800),这仍然有效。

对于它将读取的最后一行似乎没有任何特殊之处,如果我增加标题号,它将在文件中进一步读取行。

我使用的是Python 2.7和pandas 0.14。

我试图阅读的文件如下:

"River Levels","GRETA_SOUTH      (C)","GLENROWAN        (C)","ROCKY_POINT      (C)","DOCKER_RD        (C)","BOBINAWARRAH     (C)","WOOLSHED         (C)","WANGARATTA       (C)","PEECHELBA_EAST   (C)"
 41812.00001,          0.70,          0.00,          0.00,          0.20,          0.00,          0.00,          7.30,        125.00
 41812.04168,          0.70,          0.00,          0.00,          0.20,          0.00,          0.00,          7.30,        125.00

为什么它会尝试打开第1121行,当nrows + header小于此值时,为什么在它执行此操作之前它只会读取232行?

2 个答案:

答案 0 :(得分:1)

除非我读错了文档,否则这看起来像read_csv中的错误(我建议在github上填写一个问题!)。

解决方法,因为您的数据很小(以字符串形式读取):

from StringIO import StringIO
with open(inputfile) as f:
    df = pd.read_csv(StringIO(''.join(f.readlines()[:1120])), header=746, nrows=374)

我使用您提供的csv对此进行了测试,但它有效/无法提升!

答案 1 :(得分:0)

我认为这是一个关闭/计数(用户)错误!也就是说,pd.read_csv(inputfile, header=746, nrows=374)读取第1021条 1索引行,因此您应该少读一行。我可能会弄错,但这就是我在想的......


在python行索引中(与大多数python索引一样)从0开始。

In [11]: s = 'a,b\nA,B\n1,2\n3,4\n1,2,3,4'

In [12]: for i, line in enumerate(s.splitlines()): print(i, line)
0 a,b
1 A,B
2 1,2
3 3,4
4 1,2,3,4

您认为行号的通常方式来自1:

In [12]: for i, line in enumerate(s.splitlines(), start=1): print(i, line)
1 a,b
2 A,B
3 1,2
4 3,4
5 1,2,3,4

在下面我们正在阅读第3行(使用python索引)或第4行(使用1索引):

In [13]: pd.read_csv(StringIO(s), header=1, nrows=2)  # Note: header + nrows == 3
Out[13]:
   A  B
0  1  2
1  3  4

如果我们包含下一行,它会提出:

In [15]: pd.read_csv(StringIO(s), header=1, nrows=3)
CParserError: Error tokenizing data. C error: Expected 2 fields in line 5, saw 4