أسباب وعلاجات UnicodeDecodeError [Python]

2019 6 年 月 日 5

عندما حاولت قراءة مجموعة بيانات بتنسيق ملف csv مع الباندا ، واجهت على الفور الخطأ "خطأ UnicodeDecode: لا يمكن لبرنامج الترميز" utf-8 "فك تشفير البايت 0x91 في الموضع 1: بايت بداية غير صالح". دوّن ملاحظة.

محتويات الخطأ

اقرأ ملف csv الذي يحتوي على pd.read_csv.ثم ...

استيراد الباندا كـ pd df = pd.read_csv ('data.csv')

>> UnicodeDecodeError: لا يمكن لبرنامج الترميز 'utf-8' فك تشفير البايت 0x91 في الموضع 1: بايت بدء غير صالح

حصلت على خطأ في فك ترميز Unicode (تحويل رمز الحرف إلى حرف).
بالمناسبة ، يُطلق على تحويل الأحرف إلى رموز أحرف اسم الترميز.

سبب

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

هناك العديد من أنواع رموز الأحرف حسب اللغة وكيفية تعيين الأرقام. UTF-8 هي إحدى طرق الترميز الخاصة بـ Unicode التي تم تعيينها كمعيار موحد للمعيار العالمي بحيث يمكن استخدامه بأي لغة.
ومع ذلك ، لا يبدو أن UTF-8 مثالي أيضًا (ويكيبيديا:مشاكل يونيكود في البيئة اليابانية)

لا أعرف الحرف الذي تسبب في المشكلة ، ولكن نظرًا لاحتواء ملف csv على أحرف يابانية ، تسبب التحويل الضعيف بين رمز الحرف الياباني و UTF-8 في حدوث خطأ في فك ترميز Unicode. يبدو أنه كان كذلك.

المحلول

عند القراءة باستخدام read_csv () ، حدد تنسيق الترميز من الوسيطة إلى رمز الحرف الياباني (shift_jis ، وما إلى ذلك).

df = pd.read_csv ('data.csv'، encoding = 'shift_jis')

الآن يتم تحميله بشكل جيد.

تنسيق ترميز آخر متوافق مع اللغة اليابانية

بالمناسبة ، هناك العديد من رموز الأحرف التي يمكن أن تعبر عن اليابانية ، وتنفذ Python ما يلي كمعيار. (المرجعي:قائمة ترميزات بايثون القياسية )

  • cp932
  • euc_jp ، euc_jis_2004 ، euc_jisx0213
  • iso2022_jp، iso2022_jp_1، iso2022_jp_2، iso2022_jp_3
  • iso2022_jp_2004 ، iso2022_jp_2ext
  • shift_jis ، shift_jis _2004 ، shift_jisx0213

ومع ذلك ، لدي انطباع بأنه يمكن قراءته جيدًا باستخدام shift_jis أو cp932 ، وهو مقياس رئيسي.