¿Por qué los pandas read_csv no leen el número correcto de filas?

Estoy tratando de abrir parte de un archivo csv usando pandas read_csv. La sección que estoy abriendo tiene un encabezado en la línea 746 y va a la línea 1120.

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

Entonces me sale un error

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

El error tiene sentido, porque en la línea 1121 del archivo, los datos cambian de 9 campos a 17. Lo que no tiene sentido es por qué está intentando leer la línea 1121, ya que las filas y el encabezado solo deben abrir líneas hasta 1120 .

Puedo hacer que funcione reduciendo el número de filas a menos de 232. Esto aún funciona incluso si aumente el número del encabezado, de modo que comience a bajar el archivo (p. Ej., Aumente a 800).

No parece haber nada especial en la última línea que leerá, y leerá líneas más en el archivo si aumente el número del encabezado.

Estoy usando Python 2.7 y pandas 0.14.

El archivo que estoy tratando de leer se ve como:

 "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 

¿Por qué está intentando abrir la línea 1121, cuando nrows + header es menor que esto, y por qué solo leerá 232 líneas antes de hacerlo?

A menos que esté leyendo mal la documentación, esto parece un error en read_csv (¡recomiendo rellenar un problema en github!).

Una solución, ya que sus datos son pequeños (lea en las líneas como una cadena):

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

¡Probé esto con el csv que proporcionaste y funciona / no sube!

Calculo que esto es un error off / one / counting (usuario)! Es decir, pd.read_csv(inputfile, header=746, nrows=374) lee la línea 1021st 1-indexed , por lo que debe leer una fila menos. Podría estar equivocado, pero esto es lo que estoy pensando …


En la línea de python, la indexación (como en la mayoría de los índices de python) comienza en 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 

La forma habitual en que piensas los números de línea es de 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 

A continuación, leemos la tercera fila (con indexación de python) o la cuarta (con indexación de 1):

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

Y si incluimos la siguiente línea subiremos:

 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