Pandas: read_csv C引擎CParserError:标记数据时出错

创建于 2015-09-22  ·  15评论  ·  资料来源: pandas-dev/pandas

你好

我遇到了C引擎read_csv有问题的数据集。 我不确定确切的问题,但已将其缩小到我腌制的一行

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

提示问题出在read_csv,而不是to_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条评论

您倒数第二行包括一个'\r'休息时间。 我认为这是一个错误,但是一种解决方法是在通用换行模式下打开。

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时,会导致性能下降。

提供的原始数据不再可用,因此该问题无法重现。 结束语,目前尚不清楚问题是什么,但是如果您可以提供可复制的示例,请使用

@WillAyd让我知道是否需要其他信息。

由于GitHub不接受CSV,因此我将扩展名更改为.txt。
这是触发异常的代码。

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

这是文件: debug.txt

这是Windows 10中使用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.

与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文件,前两行有204列,但第三行有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 等级