pandas.parser.CParserError: Error al tokenizar datos

Resuelto abuteau asked hace 11 años • 50 respuestas

Estoy intentando usar pandas para manipular un archivo .csv pero aparece este error:

pandas.parser.CParserError: Error al tokenizar datos. Error de C: se esperaban 2 campos en la línea 3, vi 12

Intenté leer los documentos de pandas, pero no encontré nada.

Mi código es simple:

path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)

¿Cómo puedo resolver esto? ¿Debo usar el csvmódulo u otro idioma?

abuteau avatar Aug 04 '13 08:08 abuteau
Aceptado

también puedes intentarlo;

data = pd.read_csv('file1.csv', on_bad_lines='skip')

Tenga en cuenta que esto hará que se omitan las líneas ofensivas. Si no esperas muchas líneas malas y quieres (al menos) saber su cantidad e ID, usa on_bad_lines='warn'. Para un manejo avanzado de males, puede pasar un invocable.

Editar

Para Pandas < 1.3.0 prueba

data = pd.read_csv("file1.csv", error_bad_lines=False)

según la referencia de la API de pandas .

richie avatar Aug 08 '2013 14:08 richie

Podría ser un problema con

  • los delimitadores en tus datos
  • la primera fila, como señaló @TomAugspurger

Para resolverlo, intente especificar los argumentos sepy/o headeral llamar read_csv. Por ejemplo,

df = pandas.read_csv(filepath, sep='delimiter', header=None)

En el código anterior, sepdefine su delimitador y header=Nonele dice a pandas que sus datos de origen no tienen fila para encabezados/títulos de columna. Así dicen los documentos : "Si el archivo no contiene una fila de encabezado, entonces debe pasar explícitamente encabezado = Ninguno". En este caso, pandas crea automáticamente índices de números enteros para cada campo {0,1,2,...}.

Según los documentos, lo del delimitador no debería ser un problema. Los documentos dicen que "si sep es Ninguno [no especificado], intentará determinar esto automáticamente". Sin embargo, no he tenido buena suerte con esto, incluidas instancias con delimitadores obvios.

Otra solución puede ser intentar detectar automáticamente el delimitador.

# use the first 2 lines of the file to detect separator
temp_lines = csv_file.readline() + '\n' + csv_file.readline()
dialect = csv.Sniffer().sniff(temp_lines, delimiters=';,')

# remember to go back to the start of the file for the next time it's read
csv_file.seek(0) 

df = pd.read_csv(csv_file, sep=dialect.delimiter)

william_grisaitis avatar Oct 28 '2014 02:10 william_grisaitis

Este es definitivamente un problema de delimitador, ya que la mayoría de los CSV CSV se crean usando, sep='/t'así que intente read_csvusar el carácter de tabulación (\t)usando el separador /t. entonces, intente abrir usando la siguiente línea de código.

data=pd.read_csv("File_path", sep='\t')
Piyush S. Wanare avatar Apr 01 '2015 05:04 Piyush S. Wanare

El analizador se confunde con el encabezado del archivo. Lee la primera fila e infiere el número de columnas de esa fila. Pero las dos primeras filas no son representativas de los datos reales del archivo.

Pruébalo condata = pd.read_csv(path, skiprows=2)

TomAugspurger avatar Aug 04 '2013 02:08 TomAugspurger

Tuve este problema, intentaba leer en un CSV sin pasar los nombres de las columnas.

df = pd.read_csv(filename, header=None)

Especificé los nombres de las columnas en una lista de antemano y luego los pasé namesy lo resolvió de inmediato. Si no ha establecido nombres de columnas, puede crear tantos nombres de marcadores de posición como el número máximo de columnas que puedan haber en sus datos.

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)
Steven Rouk avatar Jan 08 '2019 18:01 Steven Rouk