Pandas: read_csv CエンジンCParserError:データのトークン化中にエラーが発生しました

作成日 2015年09月22日  ·  15コメント  ·  ソース: pandas-dev/pandas

こんにちは、

Cエンジンのread_csvに問題があるデータセットに遭遇しました。 正確な問題はわかりませんが、ピクルスにしてドロップボックスにアップロードした1行に絞り込みました。 ピクルスを入手した場合は、次のことを試してください。

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

次の例外が発生します。

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

Pythonエンジンを使用してCSVを読み取ろうとすると、例外はスローされません。

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

問題がto_csvではなくread_csvにあることを示唆しています。 私が使用しているバージョンは次のとおりです。

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

最も参考になるコメント

コメントのように見えたので、 @ alfonsomhcの回答を見逃し

あなたが必要です

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

全てのコメント15件

最後から2番目の行には、 '\r'区切りが含まれています。 バグだと思いますが、回避策の1つは、ユニバーサル改行モードで開くことです。

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

私もこのエラーに遭遇しています。 @ chris-b1によって提案された方法を使用すると、次のエラーが発生します。

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

また、デフォルトのegineで大きなcsvファイルを読み取るときにこの問題を発見しました。 engine = 'python'を使用すると、正常に機能します。

コメントのように見えたので、 @ alfonsomhcの回答を見逃し

あなたが必要です

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

csvファイルではなくフォルダを読み取ろうとしても同じ問題が発生しました

誰かがこの問題を調査しましたか? kerasジェネレーターでread_csvを使用すると、パフォーマンスが低下します。

提供された元のデータは利用できなくなったため、問題を再現することはできません。 問題が何であるかは明確ではないため、終了しますが、再現可能な例を提供できれば、 @ dgrahnまたは他の誰かが再開できます

@WillAyd追加情報が必要な場合は

GitHubはCSVを受け入れないため、拡張子を.txtに変更しました。
例外をトリガーするコードは次のとおりです。

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

ファイルは次のとおりです:

これは、Anacondaを使用したWindows10の例外です。

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.

そして、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 debug.txtをダウンロードしましたが、Macでpd.read_csv('debug.xt', header=None)を実行すると、次のようになります。

ParserError:データのトークン化中にエラーが発生しました。 Cエラー:3行目に204フィールドが必要で、2504が表示されました

これは、最初に説明したBuffer overflow caughtエラーとは異なります。

debug.txtファイルを調べたところ、最初の2行には204列がありますが、3行目には2504列があります。 これにより、ファイルが解析不能になり、エラーがスローされる理由が説明されます。

これは予想されますか? GitHubは、アップロードされた例を台無しにしている改行タイプ( "\ r \ n"と "\ n")の間でバックグラウンドで暗黙の変換を行っている可能性があります。

@joshlk上記のコメントで説明されているように、 names=range(2504)オプションを使用しましたか?

@dgrahn良い点。

OKはpandas.read_csv('debug.csv', chunksize=1000, names=range(2504))エラーを再現できるようになりました。

pandas.read_csv('debug.csv', names=range(2504))は正常に機能するため、元のバグとは関係がない可能性がありますが、同じ症状が発生していることに注意してください。

@joshlk必要に応じて、別の問題を開くことができます。

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

私の問題を解決しました。

engine = 'python'

私はこのアプローチを試し、大きなデータファイルをアップロードすることができました。 しかし、データフレームのディメンションを確認すると、行数が増えていることがわかりました。 そのための論理的な領域は何でしょうか?

このページは役に立ちましたか?
0 / 5 - 0 評価