UnicodeDecodeError عند القراءة
تتوقع pd.read_csv ملف UTF-8. فإذا حُفظ الملف بترميز Windows-1256 (ANSI العربي) تتوقف pandas برسالة UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 – والبايت 0xC7 هو الحرف ا في Windows-1256. عندها اذكر الترميز:
pd.read_csv('data.csv', encoding='cp1256')للملفات الآتية من Excel وويندوز العربي.encoding='latin-1'لا يفشل أبدًا لكنه يقرأ العربية كرموز غريبة – فلا تستخدمه لها.- إذا لم تعرف الترميز فاسحب الملف إلى Mojibuster: يكتشفه ويحفظ الملف بترميز UTF-8.
رموز غريبة بدل العربية في DataFrame
إذا عرض DataFrame رموزًا مثل ط§ظ„ط¹، فقد قُرئ ملف UTF-8 بترميز cp1256 أو latin-1 – أو كانت البيانات تالفة من قبل. في الحالة الأولى يكفي encoding='utf-8'. أما إذا كانت البيانات نفسها تالفة فيفيد value.encode('cp1256').decode('utf-8') للقيم المفردة. لكنه يفشل مع البيانات المختلطة بمجرد أن تكون خلية سليمة. الأسهل: أصلح الملف بـ Mojibuster ثم اقرأه.
قبل
ط§ظ„ط§ط³ظ…,ط§ظ„ظ…ط¯ظٹظ†ط©,ط§ظ„ط¥ظٹط±ط§ط¯ ط£طظ…ط¯ طط³ظ†,ط§ظ„ط±ظٹط§ط¶,1250 ظپط§ط·ظ…ط© ط§ظ„ط²ظ‡ط±ط§ط،,ط§ظ„ظ‚ط§ظ‡ط±ط©,980
بعد
الاسم,المدينة,الإيراد أحمد حسن,الرياض,1250 فاطمة الزهراء,القاهرة,980
to_csv: يعرض Excel الملف بشكل خاطئ
يكتب df.to_csv('export.csv') ملف UTF-8 بلا BOM. يفتح Excel مثل هذه الملفات بترميز ANSI فتتحول الحروف العربية إلى رموز غريبة. مع encoding='utf-8-sig' تكتب pandas علامة BOM فيتعرف Excel على UTF-8. المزيد في Excel وCSV: حروف عربية غريبة.
open() على ويندوز
يستخدم open('file.txt') بلا encoding ترميز النظام على ويندوز، وهو غالبًا cp1256 في النظام العربي. فيقرأ سكربت يعمل على لينكس ملف UTF-8 نفسه على ويندوز كرموز غريبة. لذا مرّر دائمًا encoding='utf-8' أو اضبط متغير البيئة PYTHONUTF8=1. وبحسب PEP 686 سيصبح UTF-8 افتراضيًا في إصدارات Python القادمة.
بيانات الويب مع requests
تستنتج requests قيمة response.text من ترويسة Content-Type. فإذا لم تذكر استجابة نصية مجموعة المحارف هناك فإنها تفترض ISO-8859-1، فتظهر صفحات UTF-8 العربية رموزًا غريبة. اضبط response.encoding = 'utf-8' أولًا، أو استخدم response.json() الذي يكتشف UTF-8 بنفسه.
وإذا كُتب النص بـ errors='replace' إلى ترميز لا يحوي الحروف المطلوبة فالملف يحوي ? – وعندها تضيع المعلومات، راجع ما هي الرموز الغريبة.
أسئلة شائعة
هل توجد مكتبة Python لهذا؟
نعم، ftfy تصلح الرموز الغريبة داخل كود Python. أما للملفات المفردة بلا برمجة فـ Mojibuster أسرع ويعرض لك كل تغيير قبل الحفظ.
ما قيم encoding التي أحتاجها غالبًا؟
utf-8 وutf-8-sig (UTF-8 مع BOM) وcp1256 (ويندوز العربي) وiso-8859-6 وutf-16. لا يهم حجم الحروف ولا الشرطات.
هل تبقى الفواصل والأرقام كما هي؟
نعم. يغيّر Mojibuster الحروف التالفة فقط. تبقى الفواصل وعلامات الاقتباس وفواصل الأسطر كما هي تمامًا.