UnicodeDecodeError בקריאה
pd.read_csv מצפה ל-UTF-8. אם הקובץ שמור ב-Windows-1255 (עברית ANSI), pandas נעצר עם UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf9 in position 0: invalid start byte – 0xF9 הוא האות ש ב-Windows-1255. אז ציינו את הקידוד:
pd.read_csv('data.csv', encoding='cp1255')לקבצים מאקסל ומ-Windows בעברית.encoding='iso-8859-8'לקבצים ישנים ב-ISO-8859-8 – שונה מ-cp1255בכמה תווים בלבד, ולא מכיל ניקוד.encoding='latin-1'אף פעם לא נכשל, אבל קורא עברית כ-ùìåí– לא מתאים לקבצים בעברית.- אם אינכם יודעים מה הקידוד, גררו את הקובץ ל-Mojibuster: הוא מזהה אותו ושומר את הקובץ כ-UTF-8.
×©×œ×•× במקום שלום ב-DataFrame
אם ה-DataFrame מציג שלו×, קובץ UTF-8 נקרא כ-latin-1 או כ-cp1252 – או שהנתונים היו משובשים כבר קודם. במקרה הראשון מספיק encoding='utf-8'. אם הנתונים עצמם משובשים, לערכים בודדים עוזר value.encode('cp1252').decode('utf-8'). בנתונים מעורבים זה נכשל ברגע שתא אחד כבר תקין. קל יותר: לתקן את הקובץ ב-Mojibuster ורק אחר כך לקרוא אותו.
לפני
name,city,revenue ãðä ëäï,úì àáéá,1250 ¤ éåñé ìåé,éøåùìéí,980 ¤
אחרי
name,city,revenue דנה כהן,תל אביב,1250 ₪ יוסי לוי,ירושלים,980 ₪
to_csv: אקסל מציג את הקובץ לא נכון
df.to_csv('export.csv') כותב UTF-8 בלי BOM. אקסל פותח קבצים כאלה כ-ANSI, והעברית מתהפכת לג'יבריש. עם encoding='utf-8-sig' pandas כותב BOM ואקסל מזהה UTF-8. עוד באקסל והעברית.
open() ב-Windows
open('file.txt') בלי encoding משתמש ב-Windows בקידוד המערכת, ובהתקנה בעברית זה בדרך כלל cp1255. סקריפט שעובד ב-Linux קורא אז את אותו קובץ 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), cp1255 (Windows, עברית), iso-8859-8, latin-1 ו-utf-16. אותיות גדולות ומקפים לא משנים.
מפרידים ומספרים נשמרים?
כן. Mojibuster משנה רק תווים משובשים. פסיקים, מירכאות ושורות חדשות נשארים בדיוק כפי שהיו.