أواجه مشكلة مع 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
مستخدمًا أم لا.
كل هذه الأخطاء صحيحة. أنت تقيد ما يفعله المحلل اللغوي بتمرير 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 لقراءة البيانات
التعليق الأكثر فائدة
جرب هذا: