תיקון קידוד עברית ב-Python וב-pandas

pandas קורא ×©×œ×•× במקום שלום, נעצר עם UnicodeDecodeError, או שקובץ ה-CSV שייצאתם נראה באקסל משובש? ב-Python הפרמטר encoding מכריע בין תקין למשובש. הנה המקרים האופייניים – ואת הקבצים המשובשים אפשר לתקן בדפדפן שלמעלה.

עובד עם טקסט ועם הקבצים האלה:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

למשל קובצי ייצוא מאקסל, גיבויים של מסדי נתונים, כתוביות וקוד של אתרים.

תיקון

  1. גררו קובץ או הדביקו טקסט
  2. התיקון נעשה אוטומטית
  3. העתיקו או הורידו את התוצאה
או גררו את הקובץ לכאן
  • בלי העלאה. הקבצים מתוקנים ישירות בדפדפן ולעולם לא יוצאים מהמכשיר שלכם.

  • שרתים באיחוד האירופי. Mojibuster פועל על שרת בפינלנד (האיחוד האירופי), ולכן חלה עליו תקנת הגנת המידע הכללית (GDPR). נוסח התקנה (EUR-Lex, באנגלית)

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 ורק אחר כך לקרוא אותו.

קובץ CSV מ-pandas שנפתח באקסל בלי BOM

לפני

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 משנה רק תווים משובשים. פסיקים, מירכאות ושורות חדשות נשארים בדיוק כפי שהיו.

מדריכים נוספים