Python Pandas Error tokenizing datos

Estoy tratando de usar pandas para manipular un archivo .csv pero me sale este error:

pandas.parser.CParserError: Error tokenizing datos. Error C: Se esperaban 2 campos en la línea 3, vio 12

He intentado leer los documentos de los pandas, pero no he encontrado 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 módulo csv u otro idioma?

El archivo es de Morningstar

también puedes intentarlo;

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

Tenga en cuenta que esto hará que las líneas ofensivas se omitan.

Podría ser un problema con

  • Los delimitadores en tus datos.
  • la primera fila, como lo observó @TomAugspurger

Para resolverlo, intente especificar los argumentos de sep y / o header al llamar a read_csv . Por ejemplo,

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

En el código anterior, sep define su delimitador y el header=None le dice a los pandas que sus datos de origen no tienen una fila para los encabezados / títulos de columna. Así dice la documentación : “Si el archivo no contiene una fila de encabezado, debe pasar explícitamente el encabezado = Ninguno”. En este caso, los pandas crean automáticamente índices de números enteros para cada campo {0,1,2, …}.

Según los documentos, el delimitador no debería ser un problema. Los documentos dicen que “si sep es Ninguno [no especificado], intentaremos determinar esto automáticamente”. Sin embargo, no he tenido buena suerte con esto, incluidos los casos con delimitadores obvios.

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 en el archivo.

Pruébelo con data = pd.read_csv(path, skiprows=2)

Su archivo CSV puede tener una cantidad variable de columnas y read_csv deduce la cantidad de columnas de las primeras filas. Dos formas de resolverlo en este caso:

1) Cambie el archivo CSV para que tenga una primera línea ficticia con el número máximo de columnas (y especifique el header=[0] )

2) O use names = list(range(0,N)) donde N es el número máximo de columnas.

También tuve este problema, pero quizás por una razón diferente. Tenía algunas comas en mi CSV que agregaban una columna adicional que los pandas intentaban leer. Usando los siguientes trabajos, pero simplemente ignora las malas líneas:

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

Si quieres mantener las líneas, un truco feo para manejar los errores es hacer algo como lo siguiente:

 line = [] expected = [] saw = [] cont = True while cont == True: try: data = pd.read_csv('file1.csv',skiprows=line) cont = False except Exception as e: errortype = e.message.split('.')[0].strip() if errortype == 'Error tokenizing data': cerror = e.message.split(':')[1].strip().replace(',','') nums = [n for n in cerror.split(' ') if str.isdigit(n)] expected.append(int(nums[0])) saw.append(int(nums[2])) line.append(int(nums[1])-1) else: cerror = 'Unknown' print 'Unknown Error - 222' if line != []: # Handle the errors however you want 

Procedí a escribir una secuencia de comandos para volver a insertar las líneas en el dataframe, ya que las líneas incorrectas aparecerán en la variable ‘línea’ en el código anterior. Todo esto puede evitarse simplemente usando el lector csv. Esperemos que los desarrolladores de pandas puedan facilitar el manejo de esta situación en el futuro.

Este es definitivamente un problema de delimitador, ya que la mayoría de CSV CSV se crean mediante sep='/t' así que intente read_csv usando 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') 

Yo también he tenido este problema unas cuantas veces. Casi siempre, la razón es que, para empezar, el archivo que intentaba abrir no era un archivo CSV correctamente guardado. Y por “correctamente”, quiero decir que cada fila tenía el mismo número de separadores o columnas.

Normalmente sucedió porque había abierto el archivo CSV en Excel y luego lo había guardado incorrectamente. A pesar de que la extensión del archivo era .csv, el formato CSV puro había sido alterado.

Cualquier archivo guardado con pandas to_csv tendrá el formato correcto y no debería tener ese problema. Pero si lo abres con otro progtwig, puede cambiar la estructura.

Espero que ayude.

Me encontré con el mismo problema. El uso de pd.read_table() en el mismo archivo fuente parece funcionar. No pude encontrar el motivo de esto, pero fue una solución útil para mi caso. Quizás alguien más informado pueda arrojar más luz sobre por qué funcionó.

Edición: encontré que este error se arrastra cuando tiene algo de texto en su archivo que no tiene el mismo formato que los datos reales. Por lo general, se trata de información de encabezado o pie de página (más de una línea, por lo que skip_header no funciona) que no estará separada por la misma cantidad de comas que sus datos reales (cuando use read_csv). El uso de read_table utiliza una pestaña como delimitador que podría eludir el error actual de los usuarios pero introducir otros.

Usualmente resuelvo esto leyendo los datos adicionales en un archivo y luego uso el método read_csv ().

La solución exacta puede diferir dependiendo de su archivo real, pero este enfoque me ha funcionado en varios casos

He tenido un problema similar al intentar leer una tabla delimitada por tabulaciones con espacios, comas y comillas:

 1115794 4218 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "" 1144102 3180 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", "" 368444 2328 "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", "" import pandas as pd # Same error for read_table counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c') pandas.io.common.CParserError: Error tokenizing data. C error: out of memory 

Esto dice que tiene algo que ver con el motor de análisis de C (que es el predeterminado). Tal vez cambiando a un python uno cambiará cualquier cosa.

 counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python') Segmentation fault (core dumped) 

Ahora que es un error diferente.
Si seguimos adelante e intentamos eliminar espacios de la tabla, el error de python-engine vuelve a cambiar:

 1115794 4218 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","" 1144102 3180 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus","" 368444 2328 "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides","" _csv.Error: ' ' expected after '"' 

Y queda claro que los pandas tenían problemas para analizar nuestras filas. Para analizar una tabla con el motor Python, necesitaba eliminar todos los espacios y comillas de la tabla de antemano. Mientras tanto, el motor C seguía chocando incluso con comas en filas.

Para evitar crear un nuevo archivo con reemplazos, hice esto, ya que mis tablas son pequeñas:

 from io import StringIO with open(path_counts) as f: input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0','')) counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python') 

tl; dr
Cambie el motor de análisis, intente evitar cualquier comillas / comas / espacios no delimitadores en sus datos.

Aunque no es el caso para esta pregunta, este error también puede aparecer con datos comprimidos. Establecer explícitamente el valor para la compression kwarg resolvió mi problema.

 result = pandas.read_csv(data_source, compression='gzip') 

la siguiente secuencia de comandos funciona (pierdo la primera línea de los datos -no encabezado = Ninguno presente-, pero al menos se carga):

df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

Lo siguiente NO funciona:

df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))

CParserError: Error de tokenización de datos. Error C: Se esperaban 53 campos en la línea 1605634, vio 54 Lo siguiente NO funciona:

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

CParserError: Error de tokenización de datos. Error C: Se esperaban 53 campos en la línea 1605634, sierra 54

Por lo tanto, en tu problema tienes que pasar usecols=range(0, 2)

A veces el problema no es cómo usar python, sino con los datos en bruto.
Recibí este mensaje de error

 Error tokenizing data. C error: Expected 18 fields in line 72, saw 19. 

Resultó que en la descripción de la columna a veces había comas. Esto significa que el archivo CSV debe limpiarse o debe utilizarse otro separador.

use pandas.read_csv('CSVFILENAME',header=None,sep=', ')

Al intentar leer datos csv desde el enlace.

http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data

Copié los datos del sitio en mi archivo csv. Tenía espacios adicionales, así que sep = ‘,’ y funcionó 🙂

Una alternativa que he encontrado útil para tratar con errores de análisis similares utiliza el módulo CSV para reencaminar los datos en un df pandas. Por ejemplo:

 import csv import pandas as pd path = 'C:/FileLocation/' file = 'filename.csv' f = open(path+file,'rt') reader = csv.reader(f) #once contents are available, I then put them in a list csv_list = [] for l in reader: csv_list.append(l) f.close() #now pandas has no problem getting into a df df = pd.DataFrame(csv_list) 

Considero que el módulo CSV es un poco más robusto a los archivos separados por comas con un formato deficiente, por lo que he tenido éxito con esta ruta para abordar problemas como estos.

Usar delimitador en parámetro

 pd.read_csv(filename, delimiter=",", encoding='utf-8') 

Se leerá

Tenía un conjunto de datos con números de fila preexistentes, usé index_col:

 pd.read_csv('train.csv', index_col=0) 

Esto es lo que hice.

sep='::' solucionó mi problema:

 data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::') 

Tuve un caso similar como este y entorno

 train = pd.read_csv('input.csv' , encoding='latin1',engine='python') 

trabajó

Tengo el mismo problema cuando read_csv: ParserError: Error tokenizing data. Acabo de guardar el archivo csv antiguo en un archivo csv nuevo. ¡El problema esta resuelto!

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

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

Especifiqué los nombres de las columnas en una lista de antemano y luego los puse en names , y los resolví de inmediato. Si no tiene nombres de columnas establecidos, puede crear tantos nombres de marcadores de posición como el número máximo de columnas que puedan estar en sus datos.

 col_names = ["col1", "col2", "col3", ...] df = pd.read_csv(filename, names=col_names) 

Tuve un error similar y el problema fue que tenía algunas comillas de escape en mi archivo csv y necesitaba establecer el parámetro de escapechar de manera apropiada.

Puedes hacer este paso para evitar el problema.

 train = pd.read_csv('/home/Project/output.csv' , header=None) 

solo agrega – header=None

¡¡Espero que esto ayude!!

El problema podría estar relacionado con el archivo Problemas, en mi caso, el problema se resolvió después de cambiar el nombre del archivo. sin embargo, para averiguar la razón ..

El problema para mí fue que se agregó una nueva columna a mi intradía de CSV. La solución de respuesta aceptada no funcionaría, ya que cada fila futura se descartaría si utilizara error_bad_lines=False .

La solución en este caso fue usar el parámetro pd.read_csv() en pd.read_csv() . De esta manera, puedo especificar solo las columnas que necesito leer en el CSV y mi código de Python seguirá siendo resistente a los futuros cambios del CSV siempre que exista una columna de encabezado (y los nombres de las columnas no cambien).

 usecols : list-like or callable, optional Return a subset of the columns. If list-like, all elements must either be positional (ie integer indices into the document columns) or strings that correspond to column names provided either by the user in names or inferred from the document header row(s). For example, a valid list-like usecols parameter would be [0, 1, 2] or ['foo', 'bar', 'baz']. Element order is ignored, so usecols=[0, 1] is the same as [1, 0]. To instantiate a DataFrame from data with element order preserved use pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']] for columns in ['foo', 'bar'] order or pd.read_csv(data, usecols=['foo', 'bar'])[['bar', 'foo']] for ['bar', 'foo'] order. 

Ejemplo

 my_columns = ['foo', 'bar', 'bob'] df = pd.read_csv(file_path, usecols=my_columns) 

Otra ventaja de esto es que puedo cargar muchos menos datos en la memoria si solo estoy usando 3-4 columnas de un CSV que tiene 18-20 columnas.

Recibí un .csv de un compañero de trabajo y cuando intenté leer el csv usando pd.read_csv (), recibí un error similar. Aparentemente, estaba intentando usar la primera fila para generar las columnas para el dataframe, pero había muchas filas que contenían más columnas de las que implicaría la primera fila. Terminé solucionando este problema simplemente abriendo y volviendo a guardar el archivo como .csv y usando pd.read_csv () nuevamente.

try: pandas.read_csv(path, sep = ',' ,header=None)