Pandas: read_csv C-engine CParserError: Error al tokenizar los datos

Creado en 22 sept. 2015  ·  15Comentarios  ·  Fuente: pandas-dev/pandas

Hola,

Encontré un conjunto de datos en el que el motor C read_csv tiene problemas. No estoy seguro del problema exacto, pero lo he reducido a una sola fila que he seleccionado y subido a Dropbox . Si obtiene el pepinillo, intente lo siguiente:

df = pd.read_pickle('faulty_row.pkl')
df.to_csv('faulty_row.csv', encoding='utf8', index=False)
df.read_csv('faulty_row.csv', encoding='utf8')

Obtengo la siguiente excepción:

CParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.

Si intenta leer el CSV usando el motor de Python, no se lanza ninguna excepción:

df.read_csv('faulty_row.csv', encoding='utf8', engine='python')

Sugiere que el problema es con read_csv y no con to_csv. Las versiones que uso son:

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Linux
OS-release: 3.19.0-28-generic
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: en_GB.UTF-8

pandas: 0.16.2
nose: 1.3.7
Cython: 0.22.1
numpy: 1.9.2
scipy: 0.15.1
IPython: 3.2.1
patsy: 0.3.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
Bug IO CSV Needs Info

Comentario más útil

Me perdí la respuesta de @alfonsomhc porque parecía un comentario.

Necesitas

df = pd.read_csv('test.csv', engine='python')

Todos 15 comentarios

Su penúltima línea incluye una pausa '\r' . Creo que es un error, pero una solución es abrir en modo universal de nueva línea.

pd.read_csv(open('test.csv','rU'), encoding='utf-8', engine='c')

También me encuentro con este error. Usar el método sugerido por @ chris-b1 provoca el siguiente error:

Traceback (most recent call last):
  File "C:/Users/je/Desktop/Python/comparison.py", line 30, in <module>
    encoding='utf-8', engine='c')
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 498, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 275, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 590, in __init__
    self._make_engine(self.engine)
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 731, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 1103, in __init__
    self._reader = _parser.TextReader(src, **kwds)
  File "pandas\parser.pyx", line 515, in pandas.parser.TextReader.__cinit__ (pandas\parser.c:4948)
  File "pandas\parser.pyx", line 705, in pandas.parser.TextReader._get_header (pandas\parser.c:7386)
  File "pandas\parser.pyx", line 829, in pandas.parser.TextReader._tokenize_rows (pandas\parser.c:8838)
  File "pandas\parser.pyx", line 1833, in pandas.parser.raise_parser_error (pandas\parser.c:22649)
pandas.parser.CParserError: Error tokenizing data. C error: Calling read(nbytes) on source failed. Try engine='python'.

+1

También encontré este problema al leer un archivo csv grande con el egine predeterminado. Si uso engine = 'python', entonces funciona bien.

Me perdí la respuesta de @alfonsomhc porque parecía un comentario.

Necesitas

df = pd.read_csv('test.csv', engine='python')

tuve el mismo problema al intentar leer una carpeta, no un archivo csv

¿Alguien ha investigado este problema? Está matando el rendimiento cuando se usa read_csv en un generador de keras.

Los datos originales proporcionados ya no están disponibles, por lo que el problema no es reproducible. Cerrando porque no está claro cuál es el problema, pero @dgrahn o cualquier otra persona, si puede proporcionar un ejemplo reproducible, podemos reabrir

@WillAyd Avísame si necesitas información adicional.

Como GitHub no acepta archivos CSV, cambié la extensión a .txt.
Aquí está el código que activará la excepción.

for chunk in pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)):
    pass

Aquí está el archivo: debug.txt

Aquí está la excepción de Windows 10, que usa Anaconda.

Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> for chunk in pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)): pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\programs\anaconda3\lib\site-packages\pandas\io\parsers.py", line 1007, in __next__
    return self.get_chunk()
  File "D:\programs\anaconda3\lib\site-packages\pandas\io\parsers.py", line 1070, in get_chunk
    return self.read(nrows=size)
  File "D:\programs\anaconda3\lib\site-packages\pandas\io\parsers.py", line 1036, in read
    ret = self._engine.read(nrows)
  File "D:\programs\anaconda3\lib\site-packages\pandas\io\parsers.py", line 1848, in read
    data = self._reader.read(nrows)
  File "pandas\_libs\parsers.pyx", line 876, in pandas._libs.parsers.TextReader.read
  File "pandas\_libs\parsers.pyx", line 903, in pandas._libs.parsers.TextReader._read_low_memory
  File "pandas\_libs\parsers.pyx", line 945, in pandas._libs.parsers.TextReader._read_rows
  File "pandas\_libs\parsers.pyx", line 932, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas\_libs\parsers.pyx", line 2112, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.

Y lo mismo en RedHat.

$ python3
Python 3.6.6 (default, Aug 13 2018, 18:24:23)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> for chunk in pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)): pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1007, in __next__
    return self.get_chunk()
  File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1070, in get_chunk
    return self.read(nrows=size)
  File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1036, in read
    ret = self._engine.read(nrows)
  File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1848, in read
    data = self._reader.read(nrows)
  File "pandas/_libs/parsers.pyx", line 876, in pandas._libs.parsers.TextReader.read
  File "pandas/_libs/parsers.pyx", line 903, in pandas._libs.parsers.TextReader._read_low_memory
  File "pandas/_libs/parsers.pyx", line 945, in pandas._libs.parsers.TextReader._read_rows
  File "pandas/_libs/parsers.pyx", line 932, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas/_libs/parsers.pyx", line 2112, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.

@dgrahn He descargado debug.txt y obtengo lo siguiente si ejecuta pd.read_csv('debug.xt', header=None) en una Mac:

ParserError: Error al convertir los datos en token. Error C: 204 campos esperados en la línea 3, vi 2504

Que es diferente del error Buffer overflow caught descrito originalmente.

He inspeccionado el archivo debug.txt y las dos primeras líneas tienen 204 columnas, pero la tercera línea tiene 2504 columnas. Esto haría que el archivo no se pudiera analizar y explicaría por qué se produce un error.

¿Es esto esperado? GitHub podría estar haciendo una conversión implícita en segundo plano entre los tipos de nueva línea ("\ r \ n" y "\ n") que está arruinando el ejemplo cargado.

@joshlk ¿ names=range(2504) como se describe en el comentario anterior?

@dgrahn buen punto.

Ok ahora puede reproducir el error con pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)) .

Es bueno tener en cuenta que pandas.read_csv('debug.csv', names=range(2504)) funciona bien y, por lo tanto, es poco probable que esté relacionado con el error original, pero está produciendo el mismo síntoma.

@joshlk Podría abrir un problema por separado si eso fuera preferido.

pd.read_csv(open('test.csv','rU'), encoding='utf-8', engine='python')

Resolvió mi problema.

motor = 'python'

Probé este enfoque y pude cargar archivos de datos grandes. Pero cuando verifiqué la dimensión del marco de datos, vi que el número de filas había aumentado. ¿Cuáles pueden ser las regiones lógicas para eso?

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