Pandas: read_csv C-engine CParserError: Erreur lors de la création de jetons de données

Créé le 22 sept. 2015  ·  15Commentaires  ·  Source: pandas-dev/pandas

Salut,

J'ai rencontré un ensemble de données où le moteur C read_csv a des problèmes. Je ne suis pas sûr du problème exact, mais je l'ai réduit à une seule ligne que j'ai décapée et téléchargée dans Dropbox . Si vous obtenez le cornichon, essayez ce qui suit:

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')

J'obtiens l'exception suivante:

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

Si vous essayez de lire le CSV à l'aide du moteur python, aucune exception n'est levée:

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

Suggérant que le problème vient de read_csv et non de to_csv. Les versions que j'utilise sont:

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

Commentaire le plus utile

J'ai manqué la réponse @alfonsomhc parce que cela ressemblait à un commentaire.

Vous avez besoin

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

Tous les 15 commentaires

Votre avant-dernière ligne comprend une pause '\r' . Je pense que c'est un bogue, mais une solution de contournement consiste à ouvrir en mode universel-nouvelle ligne.

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

Je rencontre également cette erreur. L'utilisation de la méthode suggérée par @ chris-b1 provoque l'erreur suivante:

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

J'ai également trouvé ce problème lors de la lecture d'un gros fichier csv avec l'égine par défaut. Si j'utilise engine = 'python', cela fonctionne bien.

J'ai manqué la réponse @alfonsomhc parce que cela ressemblait à un commentaire.

Vous avez besoin

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

eu le même problème en essayant de lire un dossier pas un fichier csv

Quelqu'un at-il enquêté sur ce problème? Cela tue les performances lors de l'utilisation de read_csv dans un générateur de keras.

Les données d'origine fournies ne sont plus disponibles, le problème n'est donc pas reproductible. Clôture car on ne sait pas quel est le problème, mais @dgrahn ou n'importe qui d'autre si vous pouvez fournir un exemple reproductible, nous pouvons rouvrir

@WillAyd Faites-moi savoir si vous avez besoin d'informations supplémentaires.

Étant donné que GitHub n'accepte pas les CSV, j'ai changé l'extension en .txt.
Voici le code qui déclenchera l'exception.

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

Voici le fichier: debug.txt

Voici l'exception de Windows 10, utilisant 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.

Et la même chose sur 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 J'ai téléchargé debug.txt et j'obtiens ce qui suit si vous exécutez pd.read_csv('debug.xt', header=None) sur un mac:

ParserError: erreur de tokenisation des données. Erreur C: 204 champs attendus à la ligne 3, vu 2504

Ce qui est différent de l'erreur Buffer overflow caught décrite à l'origine.

J'ai inspecté le fichier debug.txt et les deux premières lignes ont 204 colonnes mais la 3ème ligne a 2504 colonnes. Cela rendrait le fichier non analysable et explique pourquoi une erreur est générée.

Est-ce prévu? GitHub pourrait effectuer une conversion implicite en arrière-plan entre les types de nouvelle ligne ("\ r \ n" et "\ n") qui gâche l'exemple téléchargé.

@joshlk Avez-vous utilisé l'option names=range(2504) comme décrit dans le commentaire ci-dessus?

@dgrahn bon point.

Ok peut maintenant reproduire l'erreur avec pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)) .

Il est bon de noter que pandas.read_csv('debug.csv', names=range(2504)) fonctionne bien et qu'il est donc peu probable qu'il soit lié au bogue d'origine, mais qu'il produit le même symptôme.

@joshlk Je pourrais ouvrir un autre problème si cela était préféré.

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

J'ai résolu mon problème.

moteur = 'python'

J'ai essayé cette approche et j'ai pu télécharger de gros fichiers de données. Mais quand j'ai vérifié la dimension du dataframe, j'ai vu que le nombre de lignes avait augmenté. Quelles peuvent être les régions logiques pour cela?

Cette page vous a été utile?
0 / 5 - 0 notes