سؤال

أنا أعمل على سلسلة من المحللين حيث أحصل على مجموعة من عمليات التتبع من اختبارات الوحدة الخاصة بي مثل:

  File "c:\Python31\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 112: character maps to <undefined>

يتم فتح الملفات مع فتح () مع عدم وجود أرغمنتس إضافية.يمكنني تمرير الحجج إضافية لفتح () أو استخدام شيء في وحدة الترميز لفتح هذه بشكل مختلف?

جاء هذا مع التعليمات البرمجية التي تمت كتابتها في بيثون 2 وتحويلها إلى 3 مع أداة 2 إلى 3.

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

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

المحلول

الموضع 0 * 81 غير مخصص في ويندوز-1252 (ويعرف أيضا باسم كب 1252).يتم تعيينه إلى ش + 0081 عالية مسبقا مسبقا (هوب) حرف التحكم في اللاتينية-1 (ويعرف أيضا باسم إسو 8859-1).يمكنني إعادة إنتاج الخطأ الخاص بك في بايثون 3.1 مثل هذا:

>>> b'\x81'.decode('cp1252')
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 0: character maps to <undefined>

أو مع ملف فعلي:

>>> open('test.txt', 'wb').write(b'\x81\n')
2
>>> open('test.txt').read()
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte

الآن لعلاج هذا الملف كما اللاتينية - 1 يمكنك تمرير encoding حجة ، مثل كودييب اقترح:

>>> open('test.txt', encoding='latin-1').read()
'\x81\n'

حذار أن هناك اختلافات بين ويندوز-1257 واللاتينية-1 ترميزات ، على سبيل المثال.اللاتينية -1 ليس لديها "اقتباسات ذكية".إذا كان الملف الذي تقوم بمعالجته هو ملف نصي ، اسأل نفسك ما الذي يفعله \إكس 81 فيه.

نصائح أخرى

يمكنك الاسترخاء مع معالجة الأخطاء.

على سبيل المثال:

giveacodicetagpre.

أو:

giveacodicetagpre.

انظر المستندات .

تحرير:

ولكن هل أنت متأكد من أن المشكلة في قراءة الملف؟هل يمكن أن يحدث الاستثناء عندما يتم كتابة شيء ما إلى وحدة التحكم؟تحقق http://wiki.python.org/moin/printfails

جميع الملفات "ليست يونيكود".يونيكود هو تمثيل داخلي يجب ترميزه.تحتاج إلى تحديد لكل ملف ما تم استخدام الترميز ، وتحديد ذلك عند الضرورة عند فتح الملف.

كما تشير رسالة التتبع والخطأ, الملف المعني غير مشفر في cp1252.

إذا تم ترميزه في latin1, ، ال "\x81" أنه يشكو هو حرف التحكم ج 1 التي لا تملك حتى اسم (في يونيكود). النظر latin1 من غير المرجح للغاية أن تكون صالحة.

أنت تقول " يتم تحليل بعض الملفات مع شمل.دوم.مينيدوم "sed تحليل بنجاح أو دون جدوى?

يجب أن يعلن ملف شمل صالح ترميزه (الافتراضي هو أوتف-8) في السطر الأول ، ويجب أن لا تحتاج إلى تحديد ترميز في التعليمات البرمجية الخاصة بك.تبين لنا التعليمات البرمجية التي تستخدمها للقيام شمل.دوم.تحليل مينيدوم.

"آخرون قراءة مباشرة كما إيتيرابلز" - نموذج التعليمات البرمجية من فضلك.

اقتراح:حاول فتح بعض أنواع الملفات في متصفحك.ثم انقر فوق عرض وانقر فوق ترميز الأحرف (فايرفوكس) أو ترميز (إنترنت إكسبلورر).ما الترميز لديه متصفح خمنت [عادة موثوق]?

أدلة الترميز المحتملة الأخرى:ما هي اللغات المستخدمة في النص في الملفات?من أين حصلت على الملفات?

ملاحظة:يرجى تعديل سؤالك مع توضيح المعلومات;لا تجيب في التعليقات.

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