Pandas: read_csv "CParserError: Error al tokenizar datos" con un número variable de campos

Creado en 31 oct. 2015  ·  17Comentarios  ·  Fuente: pandas-dev/pandas

Tengo problemas con read_csv (Pandas 0.17.0) cuando intento leer un archivo csv de más de 380 MB. El archivo comienza con 54 campos, pero algunas líneas tienen 53 campos en lugar de 54. Ejecutar el siguiente código me da el siguiente error:

parser = lambda x: datetime.strptime(x, '%y %m %d %H %M %S %f')
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),
                        parse_dates={"TIMESTAMP": [0, 1, 2, 3, 4, 5, 6]},
                        date_parser=parser,
                        header=None)

Error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Si paso la palabra clave error_bad_lines=False , las líneas problemáticas se muestran de forma similar al ejemplo siguiente:

Skipping line 1683401: expected 53 fields, saw 54

sin embargo, esta vez aparece el siguiente error (también el DataFrame no se carga):

CParserError: Too many columns specified: expected 54 and found 53

Si paso la palabra clave engine='python' , no obtengo ningún error, pero lleva mucho tiempo analizar los datos. Tenga en cuenta que 53 y 54 se cambian en los mensajes de error dependiendo de si se usa error_bad_lines=False o no.

IO CSV Usage Question

Comentario más útil

Prueba esto:

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

Todos 17 comentarios

estos errores son todos correctos. está restringiendo lo que hace el analizador pasando usecols y names . no haga esto y vea si puede analizarlo.

Es muy difícil diagnosticar algo como esto sin una muestra del archivo que se reproduce.

también muestra pd.show_versions()

Con el archivo de datos original:

pd.read_csv(filename) sin otras palabras clave parece analizar los datos sin errores. pd.read_csv(filename, header=None) da el siguiente error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Totalmente de acuerdo en que es muy difícil de diagnosticar sin los datos de muestra. Intenté generar el error con un archivo csv con unas pocas líneas (algunas tienen 53 campos, otras 54), pd.read_csv llena los huecos con NaN como se esperaba. Repetí pasando usecols y header=None , todavía funciona. Parece que el archivo original tiene algún tipo de problema que genera todos los errores.

pd.show_versions() salida de la siguiente manera:

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None

pandas: 0.17.0
nose: 1.3.7
pip: 7.1.2
setuptools: 18.4
Cython: 0.22.1
numpy: 1.10.1
scipy: 0.16.0
statsmodels: 0.6.1
IPython: 3.2.0
sphinx: 1.3.1
patsy: 0.3.0
dateutil: 2.4.2
pytz: 2015.6
blosc: None
bottleneck: 1.0.0
tables: 3.2.0
numexpr: 2.4.3
matplotlib: 1.4.3
openpyxl: 1.8.5
xlrd: 0.9.3
xlwt: 1.0.0
xlsxwriter: 0.7.3
lxml: 3.4.4
bs4: 4.3.2
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.5
pymysql: None
psycopg2: None
pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

se espera ya que el número de columnas se infiere de la primera línea. Si pasa names si usará esto como una característica determinante.

Así que sigue probando varias opciones. En realidad, lo está restringiendo un poco con names y usecols . Es mejor que lo lea y luego vuelva a indexar lo que necesita.

Si se usa engine='python' , curiosamente, sin embargo, carga el DataFrame sin ningún problema. Usé el siguiente fragmento para extraer las primeras 3 líneas en el archivo y 3 de las líneas ofensivas (obtuve los números de línea del mensaje de error).

from csv import reader
N = int(input('What line do you need? > '))
with open(filename) as f:
    print(next((x for i, x in enumerate(reader(f)) if i == N), None))

Líneas 1-3:

['08', '8', '7', '5', '0', '12', '54', '0', '11', '1', '58', '9', '68', '48.2', '0.756', '11.6', '17.5', '13.3', '4.3', '11.3', '32.2', '6.4', '4.1', '5.6', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '15', '80', '0', '11', '1', '62', '9', '69', '77.8', '3.267', '11.2', '17.7', '14.8', '4.2', '15.2', '29.1', '18.4', '10.0', '18.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '21', '52', '0', '11', '1', '61', '11', '51', '29.4', '0.076', '4.1', '13.8', '8.3', '21.5', '5.3', '3.1', '5.7', '3.0', '6.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

Líneas infractoras:

['09', '9', '15', '22', '46', '9', '51', '0', '11', '1', '57', '9', '70', '36.3', '0.242', '11.8', '16.2', '6.4', '4.1', '5.8', '31.3', '5.5', '3.9', '6.8', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '25', '31', '0', '11', '1', '70', '9', '73', '67.8', '2.196', '10.4', '17.0', '13.4', '4.4', '12.2', '31.8', '15.6', '4.2', '16.2', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '28', '41', '0', '11', '1', '70', '5', '22', '7.4', '0.003', '4.0', '13.1', '3.4', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

Como sugirió, intentaré leer el archivo y luego modificar el DataFrame (cambiar el nombre de las columnas, eliminar las innecesarias, etc.) o simplemente usar el motor python (tiempo de procesamiento prolongado).

Según una investigación adicional, la siguiente secuencia de comandos funciona (pierdo la primera línea de los datos -no header=None present-, 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 tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Lo siguiente NO funciona:

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

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

cerrando como pregunta de uso.

dic_df = _create_init_dic ("C: / Users / swati / Downloads / VQA-Med 2018 Dataset / c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train / VQAMed2018Train / VQAMed2018Train)-QA.csv"
ParserError: Error al convertir los datos en token. Error C: 1 campos esperados en la línea 33, sierra 3

Prueba esto:

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

Lo probé y funcionó para un error similar, ¡gracias!

intente agregar quoting=3 cuando lea

¿Hay alguna manera de que los pandas simplemente ignoren los campos adicionales en cualquier fila que tenga más campos?
por ejemplo, en el caso "53 campos esperados en la línea 1605634, vi 54"
simplemente suelta el campo 54 en la línea 1605634

¡Otro caso! pero resuelto con "error_bad_lines = False", todavía imprime el error pero 'código de salida 0'

Tengo el mismo error

Acabo de agregar el parámetro delimitador en modo read_csv

Y funcionó

error_bad_lines = Falso
funciona

pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

se espera ya que el número de columnas se infiere de la primera línea. Si pasa names si usará esto como una característica determinante.

Así que sigue probando varias opciones. En realidad, lo está restringiendo un poco con names y usecols . Es mejor que lo lea y luego vuelva a indexar lo que necesita.

¡Esto funciona! Escribo csv usando el lenguaje R e intento leerlo en python. La primera línea debe tener la longitud máxima para todas las líneas. De esta forma solucionará el problema de las líneas defectuosas y no perderá ninguna línea.

Si intenta importar un archivo .xlsx usando el comando pd.read_csv, obtendrá este error.

Intente usar pd.read_excel en lugar de pd.read_csv

La forma más fácil de solucionarlo es transformar su archivo CSV en un archivo de Excel y usar pd.read_excel en lugar de pd.read_csv para leer los datos

¿Fue útil esta página
0 / 5 - 0 calificaciones