Pandas: read_csv C-engine CParserError: Fehler beim Tokenisieren von Daten

Erstellt am 22. Sept. 2015  ·  15Kommentare  ·  Quelle: pandas-dev/pandas

Hallo,

Ich habe einen Datensatz gefunden, bei dem die C-Engine read_csv Probleme hat. Ich bin mir über das genaue Problem nicht sicher, habe es jedoch auf eine einzelne Zeile eingegrenzt, die ich ausgewählt

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

Ich bekomme folgende Ausnahme:

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

Wenn Sie versuchen, die CSV mit der Python-Engine zu lesen, wird keine Ausnahme ausgelöst:

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

Es wird vorgeschlagen, dass das Problem bei read_csv und nicht bei to_csv liegt. Die Versionen, die ich benutze, sind:

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

Hilfreichster Kommentar

Ich habe die Antwort von

Du brauchst

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

Alle 15 Kommentare

Ihre vorletzte Zeile enthält eine Pause von '\r' . Ich denke, es ist ein Fehler, aber eine Problemumgehung besteht darin, im Universal-New-Line-Modus zu öffnen.

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

Ich stoße auch auf diesen Fehler. Die Verwendung der von @ chris-b1 vorgeschlagenen Methode verursacht den folgenden Fehler:

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

Ich habe dieses Problem auch beim Lesen einer großen CSV-Datei mit dem Standard-Egine gefunden. Wenn ich engine = 'python' verwende, funktioniert es einwandfrei.

Ich habe die Antwort von

Du brauchst

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

hatte das gleiche Problem beim Versuch, einen Ordner zu lesen, keine CSV-Datei

Hat jemand dieses Problem untersucht? Bei Verwendung von read_csv in einem Keras-Generator wird die Leistung beeinträchtigt.

Die bereitgestellten Originaldaten sind nicht mehr verfügbar, sodass das Problem nicht reproduzierbar ist. Schließen, da nicht klar ist, um welches Problem es sich handelt, aber @dgrahn oder sonst jemand, wenn Sie ein reproduzierbares Beispiel liefern können, können wir es erneut öffnen

@ WillAyd Lassen Sie mich wissen, wenn Sie zusätzliche Informationen benötigen.

Da GitHub keine CSVs akzeptiert, habe ich die Erweiterung in .txt geändert.
Hier ist der Code, der die Ausnahme auslöst.

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

Hier ist die Datei: debug.txt

Hier ist die Ausnahme von Windows 10 mit 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.

Und das Gleiche gilt für 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 Ich habe debug.txt heruntergeladen und erhalte Folgendes, wenn Sie pd.read_csv('debug.xt', header=None) auf einem Mac ausführen:

ParserError: Fehler beim Tokenisieren von Daten. C-Fehler: Erwartete 204 Felder in Zeile 3, sah 2504

Dies unterscheidet sich von dem ursprünglich beschriebenen Fehler Buffer overflow caught .

Ich habe die Datei debug.txt überprüft und die ersten beiden Zeilen haben 204 Spalten, aber die dritte Zeile hat 2504 Spalten. Dies würde die Datei nicht analysierbar machen und erklärt, warum ein Fehler ausgelöst wird.

Wird das erwartet? GitHub führt möglicherweise im Hintergrund eine implizite Konvertierung zwischen Zeilenumbrucharten ("\ r \ n" und "\ n") durch, die das hochgeladene Beispiel durcheinander bringt.

@joshlk Haben Sie die Option names=range(2504) wie im obigen Kommentar beschrieben?

@dgrahn guter Punkt.

Ok kann jetzt den Fehler mit pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)) reproduzieren.

Es ist gut zu bemerken, dass pandas.read_csv('debug.csv', names=range(2504)) funktioniert und daher unwahrscheinlich mit dem ursprünglichen Fehler zusammenhängt, aber das gleiche Symptom hervorruft.

@joshlk Ich könnte ein separates Problem eröffnen, wenn das vorzuziehen wäre.

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

Mein Problem gelöst.

engine = 'python'

Ich habe diesen Ansatz ausprobiert und konnte große Datendateien hochladen. Als ich jedoch die Dimension des Datenrahmens überprüfte, stellte ich fest, dass die Anzahl der Zeilen gestiegen ist. Was können die logischen Regionen dafür sein?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen