2014-09-23 609 views
3

我想用pandas read_csv打开一部分csv文件。我打开一节对线746头,并进入行1120为什么pandas read_csv没有读取正确的行数?

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和熊猫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 +头小于这个,它为什么会只读232线它之前这个?

+0

也河水平!一个接近我自己心的话题! (我不能再+1!) – 2014-09-24 05:28:40

回答

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测试这和它的作品/不提高!

+0

谢谢你的工作。我将在github上提出这个问题。 – 2014-09-24 06:51:14

+0

@ChrisLeahy:你是否在GitHub上存档?这个问题在两年后似乎仍然存在Pandas 0.19! – 2016-11-21 01:25:00

+2

对于仍然遇到这个问题的人来说,这是一个错误,应该修正为0.19.2。在此之前使用engine ='python'是最好的解决方法。 – 2016-12-06 06:01:12

0

我认为这是一个/计数(用户)错误!也就是,pd.read_csv(inputfile, header=746, nrows=374)读取的是1021st 1索引行,所以您应该读取更少的行。我可能是错误的,但在这里就是我想...


在蟒蛇线索引(与大多数蟒索引)从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:

​​

在我们阅读了下面的第三行(与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 
+0

谢谢。我足够做一个新手来做这个错误,但我不认为这是这样的情况。如果是这样,将行数从374改为373应该可以解决这个问题,但我需要将它改为更少的工作。 – 2014-09-23 07:29:32

+0

你需要改变它到什么程度?也许还有另一个排? – 2014-09-23 20:11:06

+0

231是我能走的最高境界。奇怪的部分是,如果我增加头线(例如到800),它仍然工作,只要我不增加过去的231线的数量。 – 2014-09-24 00:20:43