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