Pandas: read_csv "CParserError: خطأ في تحويل البيانات إلى رمز مميز" بعدد الحقول المتغير

تم إنشاؤها على ٣١ أكتوبر ٢٠١٥  ·  17تعليقات  ·  مصدر: pandas-dev/pandas

أواجه مشكلة مع read_csv (Pandas 0.17.0) عند محاولة قراءة ملف CSV يزيد حجمه عن 380 ميغابايت. يبدأ الملف بـ 54 حقلاً ولكن بعض الأسطر بها 53 حقلاً بدلاً من 54. تشغيل الكود أدناه يعطيني الخطأ التالي:

parser = lambda x: datetime.strptime(x, '%y %m %d %H %M %S %f')
df = pd.read_csv(filename,
                         names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                                'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                                'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                                'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                                'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                                'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'],
                        usecols=range(0, 42),
                        parse_dates={"TIMESTAMP": [0, 1, 2, 3, 4, 5, 6]},
                        date_parser=parser,
                        header=None)

خطأ:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

إذا مررت بالكلمة الأساسية error_bad_lines=False ، فسيتم عرض الأسطر التي بها مشكلات مشابهة للمثال أدناه:

Skipping line 1683401: expected 53 fields, saw 54

ومع ذلك ، تلقيت الخطأ التالي هذه المرة (أيضًا لا يتم تحميل DataFrame):

CParserError: Too many columns specified: expected 54 and found 53

إذا مررت بالكلمة الأساسية engine='python' ، فلن أحصل على أي أخطاء ، لكن تحليل البيانات يستغرق وقتًا طويلاً حقًا. يرجى ملاحظة أنه تم تبديل 53 و 54 في رسائل الخطأ اعتمادًا على ما إذا كان error_bad_lines=False مستخدمًا أم لا.

IO CSV Usage Question

التعليق الأكثر فائدة

جرب هذا:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

ال 17 كومينتر

كل هذه الأخطاء صحيحة. أنت تقيد ما يفعله المحلل اللغوي بتمرير usecols و names . لا تفعل هذا ومعرفة ما إذا كان يمكنك تحليلها.

من الصعب جدًا تشخيص شيء مثل هذا بدون عينة من الملف الذي يتم إعادة إنتاجه.

اعرض أيضًا pd.show_versions()

مع ملف البيانات الأصلي:

pd.read_csv(filename) مع عدم وجود كلمات رئيسية أخرى يقوم بتحليل البيانات بدون أخطاء. يعطي pd.read_csv(filename, header=None) الخطأ التالي:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

أوافق تمامًا على أنه من الصعب جدًا التشخيص بدون بيانات العينة. حاولت إنشاء الخطأ بملف csv ببضعة أسطر (بعضها يحتوي على 53 حقلاً ، والبعض الآخر 54 حقلاً) ، pd.read_csv يملأ الفجوات باستخدام NaNs كما هو متوقع. كررت بتمرير usecols و header=None ، لا يزال يعمل. يبدو أن الملف الأصلي به نوع من المشكلات التي تثير جميع الأخطاء.

الناتج pd.show_versions() كالتالي:

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None

pandas: 0.17.0
nose: 1.3.7
pip: 7.1.2
setuptools: 18.4
Cython: 0.22.1
numpy: 1.10.1
scipy: 0.16.0
statsmodels: 0.6.1
IPython: 3.2.0
sphinx: 1.3.1
patsy: 0.3.0
dateutil: 2.4.2
pytz: 2015.6
blosc: None
bottleneck: 1.0.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
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.5
pymysql: None
psycopg2: None
pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

متوقع حيث يتم استنتاج عدد الأعمدة من السطر الأول. إذا قمت بتمرير names إذا كنت ستستخدم هذا كميزة محددة.

لذا استمر في تجربة الخيارات المختلفة. أنت تقيده قليلاً في الواقع بـ names و usecols . قد يكون من الأفضل لك قراءتها ، ثم إعادة فهرستها لما تحتاجه.

إذا تم استخدام engine='python' ، فمن الغريب أنه يقوم بتحميل DataFrame دون أي عوائق. لقد استخدمت المقتطف التالي لاستخراج أول 3 أسطر في الملف و 3 من الأسطر المسيئة (حصلت على أرقام الأسطر من رسالة الخطأ).

from csv import reader
N = int(input('What line do you need? > '))
with open(filename) as f:
    print(next((x for i, x in enumerate(reader(f)) if i == N), None))

الأسطر 1-3:

['08', '8', '7', '5', '0', '12', '54', '0', '11', '1', '58', '9', '68', '48.2', '0.756', '11.6', '17.5', '13.3', '4.3', '11.3', '32.2', '6.4', '4.1', '5.6', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '15', '80', '0', '11', '1', '62', '9', '69', '77.8', '3.267', '11.2', '17.7', '14.8', '4.2', '15.2', '29.1', '18.4', '10.0', '18.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '21', '52', '0', '11', '1', '61', '11', '51', '29.4', '0.076', '4.1', '13.8', '8.3', '21.5', '5.3', '3.1', '5.7', '3.0', '6.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

الأسطر المخالفة:

['09', '9', '15', '22', '46', '9', '51', '0', '11', '1', '57', '9', '70', '36.3', '0.242', '11.8', '16.2', '6.4', '4.1', '5.8', '31.3', '5.5', '3.9', '6.8', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '25', '31', '0', '11', '1', '70', '9', '73', '67.8', '2.196', '10.4', '17.0', '13.4', '4.4', '12.2', '31.8', '15.6', '4.2', '16.2', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '28', '41', '0', '11', '1', '70', '5', '22', '7.4', '0.003', '4.0', '13.1', '3.4', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

كما اقترحت ، سأحاول قراءة الملف ، ثم تعديل DataFrame (إعادة تسمية الأعمدة ، وحذف الأعمدة غير الضرورية وما إلى ذلك) أو ببساطة استخدام المحرك python (وقت المعالجة الطويل).

في مزيد من التحقيق ، يعمل تسلسل الأوامر التالي (أفقد السطر الأول من البيانات -لا يوجد header=None موجود- ، لكنه يتم تحميله على الأقل):

df = pd.read_csv(filename, 
                 usecols=range(0, 42))
df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                        'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                        'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                        'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                        'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                        'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

التالية لا يعمل:

df = pd.read_csv(filename,
                 names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                        'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                        'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                        'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                        'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                        'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'],
                 usecols=range(0, 42))

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

التالية لا يعمل:

df = pd.read_csv(filename,
                 header=None)

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

إغلاق كسؤال الاستخدام.

dic_df = _create_init_dic ("C: / Users / swati / Downloads / VQA-Med 2018 Dataset / c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train / VQAMed2018Train / VQAMed2018Train-QA.csv)
ParserError: خطأ في تحويل البيانات إلى رمز مميز. خطأ C: توقع 1 حقل في السطر 33 ، رأى 3

جرب هذا:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

حاولت ذلك وعملت لخطأ مشابه شكرا لك!

حاول إضافة quoting=3 عند القراءة

هل هناك طريقة لتجاهل الباندا الحقول الإضافية في أي صف يحتوي على المزيد من الحقول؟
على سبيل المثال في حالة "توقع 53 حقلاً في السطر 1605634 ، رأى 54"
انها مجرد إسقاط الحقل 54 في السطر 1605634

قضية أخرى! ولكن تم حله باستخدام "error_bad_lines = False" ، مازال يطبع الخطأ ولكن "رمز الخروج 0"

تلقيت نفس الخطأ

أقوم فقط بإضافة معلمة المحدد في وضع read_csv

وعملت

error_bad_lines = خطأ
إنها تعمل

pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

متوقع حيث يتم استنتاج عدد الأعمدة من السطر الأول. إذا قمت بتمرير names إذا كنت ستستخدم هذا كميزة محددة.

لذا استمر في تجربة الخيارات المختلفة. أنت تقيده قليلاً في الواقع بـ names و usecols . قد يكون من الأفضل لك قراءتها ، ثم إعادة فهرستها لما تحتاجه.

هذا يعمل! أكتب csv باستخدام لغة R وأحاول قراءتها بلغة python. يجب أن يكون للسطر الأول أقصى طول لجميع الأسطر. بهذه الطريقة ستصلح مشكلة الخطوط السيئة ولن تفقد أي خطوط.

إذا كنت ستحاول استيراد ملف .xlsx باستخدام الأمر pd.read_csv ، فستتلقى هذا الخطأ.

جرب استخدام pd.read_excel بدلاً من pd.read_csv

أسهل طريقة لإصلاحها هي تحويل ملف CSV إلى ملف Excel واستخدام pd.read_excel بدلاً من pd.read_csv لقراءة البيانات

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