سؤال

أحاول تنسيق ملف بحيث يمكن إدراجها في قاعدة بيانات، يتم ضغط الملف في الأصل وكبير 1.3 ميغابايت. كل سطر يبدو شيئا مثل هذا:

398،٪ 7 -Anoniem + 001٪ 7E، 543،480،7525010،1775،0

هذه هي الطريقة التي يبدو بها الكود تظليل هذا الملف:

   Village = gzip.open(Root+'\\data'+'\\' +str(Newest_Date[0])+'\\' +str(Newest_Date[1])+'\\' +str(Newest_Date[2])\
               +'\\'+str(Newest_Date[3])+' village.gz');
Village_Parsed = str
for line in Village:
    Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);
print(Village.readline());

عندما أقوم بتشغيل البرنامج، أحصل على هذا الخطأ:

Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line);

ملف "c: python31 lib urllib parse.py"، خط 404، في سلسلة unquote_plus = string.replace ('+'، '') TypeError: توقع كائن مع واجهة المخزن المؤقت

أي فكرة ما هو الخطأ هنا؟ شكرا مقدما على أي مساعدة :)

هل كانت مفيدة؟

المحلول

import gzip, os, urllib.parse

archive_relpath = os.sep.join(map(str, Newest_Date[:4])) + ' village.gz'  
archive_path = os.path.join(Root, 'data', archive_relpath)

with gzip.open(archive_path) as Village:
    Village_Parsed = ''.join(urllib.parse.unquote_plus(line.decode('ascii'))
                             for line in Village)
    print(Village_Parsed)

انتاج:

398، ~ anoniem 001 ~، 543،480،7525010،1775،0

ملاحظة: RFC 3986 - معرف الموارد موحدة (URI): بناء جملة عام يقول:

لا تفويض هذه المواصفات أي ترميز حرف معين لرسم خرائط بين أحرف URI وأثاميات تستخدم لتخزين أو نقل تلك الأحرف. عند ظهور URI في عنصر بروتوكول، يتم تعريف ترميز الأحرف من خلال هذا البروتوكول؛ بدون مثل هذا التعريف، يفترض أن يكون URI في نفس الشخصية ترميز النص المحيط.

لذلك 'ascii' في ال line.decode('ascii') يجب استبدال جزء بأي ترميز الأحرف التي استخدمتها لترميز النص الخاص بك.

نصائح أخرى

المشكلة 1 هي أن Urllib.unquote_plus لا يحب line أنك قمت بتغذيةها. يجب أن تكون الرسالة "يرجى تقديم كائن Str" :-) أقترح عليك إصلاح المشكلة 2 أدناه، وإدراج:

print('line', type(line), repr(line))

مباشرة بعد الخاص بك for بيان حتى تتمكن من رؤية ما تحصل عليه line.

ستجد أنه بإرجاع كائنات بايتات:

>>> [line for line in gzip.open('test.gz')]
[b'nudge nudge\n', b'wink wink\n']

باستخدام وضع "R" له تأثير ضئيل:

>>> [line for line in gzip.open('test.gz', 'r')]
[b'nudge nudge\n', b'wink wink\n']

أقترح أنه بدلا من المرور line إلى تحليل روتين تمر line.decode('UTF-8') ... أو أي ترميز تم استخدامه عند كتابة ملف GZ.

المشكلة 2 في هذا الخط:

Village_Parsed = str

str هو نوع. تحتاج إلى كائن إطاري فارغ. للحصول على ذلك، يمكنك استدعاء النوع IE str() وهو صحيح رسميا ولكن غير عملي / غير عادي / Scoppable / غريب عند مقارنته باستخدام سلسلة ثابتة '' ... لذلك افعل هذا:

Village_Parsed = ''

لديك أيضا مشكلة 3: بيانك الأخير يحاول قراءة ملف GZ بعد EOF.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top