Pandas: read_csv C-engine CParserError: Kesalahan data tokenizing

Dibuat pada 22 Sep 2015  ·  15Komentar  ·  Sumber: pandas-dev/pandas

Hai,

Saya telah menemukan kumpulan data di mana read_csv C-engine mengalami masalah. Saya tidak yakin dengan masalah tepatnya tetapi saya telah mempersempitnya menjadi satu baris yang telah saya asinan dan mengunggahnya ke dropbox . Jika Anda mendapatkan acar coba yang berikut ini:

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

Saya mendapatkan pengecualian berikut:

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

Jika Anda mencoba dan membaca CSV menggunakan mesin python maka tidak terkecuali yang dilempar:

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

Menyarankan bahwa masalahnya ada pada read_csv dan bukan to_csv. Versi yang saya gunakan adalah:

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

Komentar yang paling membantu

Saya melewatkan jawaban @alfonsomhc karena hanya terlihat seperti komentar.

Anda membutuhkan

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

Semua 15 komentar

Baris kedua hingga terakhir Anda menyertakan istirahat '\r' . Saya pikir ini bug, tetapi salah satu solusinya adalah membuka dalam mode baris baru universal.

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

Saya mengalami kesalahan ini juga. Menggunakan metode yang disarankan oleh @ chris-b1 menyebabkan kesalahan berikut:

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

Saya juga menemukan masalah ini saat membaca file csv besar dengan egine default. Jika saya menggunakan engine = 'python' maka itu berfungsi dengan baik.

Saya melewatkan jawaban @alfonsomhc karena hanya terlihat seperti komentar.

Anda membutuhkan

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

memiliki masalah yang sama saat mencoba membaca folder, bukan file csv

Adakah yang menginvestigasi masalah ini? Ini mematikan kinerja saat menggunakan read_csv di generator keras.

Data asli yang diberikan tidak lagi tersedia sehingga masalah tidak dapat direkonstruksi. Menutup karena tidak jelas apa masalahnya, tetapi @dgrahn atau siapa pun jika Anda dapat memberikan contoh yang dapat direproduksi, kami dapat membuka kembali

@ WillAyd Beri tahu saya jika Anda memerlukan info tambahan.

Karena GitHub tidak menerima CSV, saya mengubah ekstensinya menjadi .txt.
Inilah kode yang akan memicu pengecualian.

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

Ini filenya: debug.txt

Berikut pengecualian dari Windows 10, menggunakan 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.

Dan hal yang sama di 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 Saya telah mengunduh debug.txt dan saya mendapatkan yang berikut ini jika Anda menjalankan pd.read_csv('debug.xt', header=None) pada mac:

ParserError: Kesalahan membuat token data. C error: Diharapkan 204 bidang di baris 3, melihat 2504

Yang berbeda dari kesalahan Buffer overflow caught dijelaskan sebelumnya.

Saya telah memeriksa file debug.txt dan dua baris pertama memiliki 204 kolom tetapi baris ke-3 memiliki 2504 kolom. Ini akan membuat file tidak dapat diuraikan dan menjelaskan mengapa terjadi kesalahan.

Apakah ini diharapkan? GitHub mungkin melakukan beberapa konversi implisit di latar belakang antara tipe baris baru ("\ r \ n" dan "\ n") yang mengacaukan contoh yang diunggah.

@joshlk Apakah Anda menggunakan opsi names=range(2504) seperti yang dijelaskan dalam komentar di atas?

@hhhh .

Ok sekarang dapat mereproduksi kesalahan dengan pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)) .

Penting untuk dicatat bahwa pandas.read_csv('debug.csv', names=range(2504)) berfungsi dengan baik dan kemudian tidak mungkin terkait dengan bug asli tetapi menghasilkan gejala yang sama.

@joshlk Saya bisa membuka masalah terpisah jika itu lebih disukai.

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

Memecahkan masalah saya.

mesin = 'python'

Saya mencoba pendekatan ini dan dapat mengunggah file data besar. Tetapi ketika saya memeriksa dimensi kerangka data saya melihat bahwa jumlah baris telah meningkat. Apa yang bisa menjadi wilayah logis untuk itu?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat