Pandas: read_csv C-engine CParserError: خطأ في تحويل البيانات إلى رموز رمزية

تم إنشاؤها على ٢٢ سبتمبر ٢٠١٥  ·  15تعليقات  ·  مصدر: pandas-dev/pandas

مرحبا،

لقد واجهت مجموعة بيانات حيث توجد مشكلات في read_csv بمحرك C. لست متأكدًا من المشكلة بالضبط ولكني قمت بتضييقها إلى صف واحد قمت بخلعه وتحميله إلى صندوق الإسقاط . إذا حصلت على المخلل فجرب ما يلي:

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.

إذا حاولت قراءة ملف CSV باستخدام محرك Python ، فلن يتم طرح أي استثناء:

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

لقد وجدت أيضًا هذه المشكلة عند قراءة ملف csv كبير باستخدام ملف egine الافتراضي. إذا استخدمت المحرك = 'python' فإنه يعمل بشكل جيد.

فاتني إجابة alfonsomhc لأنها بدت وكأنها تعليق.

انت تحتاج

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

واجهت نفس المشكلة أثناء محاولة قراءة مجلد وليس ملف csv

هل حقق أي شخص في هذه المسألة؟ إنه يقتل الأداء عند استخدام read_csv في مولد keras.

لم تعد البيانات الأصلية المقدمة متوفرة ، لذا لا يمكن تكرار ظهور المشكلة. سيتم الإغلاق لأنه ليس من الواضح ما هي المشكلة ، ولكن dgrahn أو أي شخص آخر إذا كان بإمكانك تقديم مثال قابل للتكرار يمكننا إعادة فتحه

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 وأحصل على ما يلي إذا قمت بتشغيل pd.read_csv('debug.xt', header=None) على جهاز Mac:

ParserError: خطأ في تحويل البيانات إلى رمز مميز. خطأ C: متوقع 204 حقلاً في السطر 3 ، رأى 2504

والذي يختلف عن الخطأ Buffer overflow caught الموصوف في الأصل.

لقد قمت بفحص ملف debug.txt وكان أول سطرين به 204 أعمدة ولكن السطر الثالث يحتوي على 2504 عمودًا. سيؤدي هذا إلى جعل الملف غير قابل للتحليل ويشرح سبب حدوث خطأ.

هل هذا متوقع؟ يمكن أن يقوم GitHub ببعض التحويل الضمني في الخلفية بين أنواع الأسطر الجديدة ("\ r \ n" و "\ n") الذي يفسد المثال الذي تم تحميله.

joshlk هل استخدمت الخيار names=range(2504) كما هو موضح في التعليق أعلاه؟

dgrahn نقطة جيدة.

حسنًا ، يمكن الآن إعادة إنشاء الخطأ باستخدام 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')

حل مشكلتي.

المحرك = "بيثون"

لقد جربت هذا النهج وتمكنت من تحميل ملفات بيانات كبيرة. لكن عندما راجعت أبعاد إطار البيانات ، رأيت أن عدد الصفوف قد زاد. ماذا يمكن أن تكون المناطق المنطقية لذلك؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات