Διόρθωση της κωδικοποίησης ελληνικών σε Python και pandas

Το pandas διαβάζει αβ αντί για αβ, σταματά με UnicodeDecodeError ή το CSV που εξάγετε φαίνεται λάθος στο Excel; Στην Python η παράμετρος encoding κάνει τη διαφορά. Εδώ είναι οι τυπικές περιπτώσεις – και μπορείτε να επισκευάσετε χαλασμένα αρχεία στον browser παραπάνω.

Λειτουργεί με κείμενο και με αυτά τα αρχεία:

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

Για παράδειγμα εξαγωγές από το Excel, αντίγραφα ασφαλείας βάσεων δεδομένων, υπότιτλοι και κώδικας ιστοσελίδων.

Διόρθωση

  1. Σύρετε ένα αρχείο ή επικολλήστε κείμενο
  2. Η διόρθωση γίνεται αυτόματα
  3. Αντιγράψτε ή κατεβάστε το αποτέλεσμα
ή σύρετε το αρχείο εδώ

UnicodeDecodeError κατά την ανάγνωση

Το pd.read_csv περιμένει UTF-8. Αν το αρχείο είναι αποθηκευμένο σε Windows-1253 (ελληνικό ANSI), το pandas σταματά με UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byte – το 0xC1 είναι το Α στα Windows-1253. Τότε δηλώστε την κωδικοποίηση:

  • pd.read_csv('dedomena.csv', encoding='cp1253') για αρχεία από Excel και ελληνικά Windows.
  • encoding='iso-8859-7' για αρχεία σε ISO-8859-7 – διαφέρει από το cp1253 σε λίγους χαρακτήρες, όπως το €.
  • encoding='latin-1' δεν αποτυγχάνει ποτέ, αλλά διαβάζει τα ελληνικά ως Êáëçìýñá – δεν κάνει για ελληνικά αρχεία.
  • Αν δεν ξέρετε την κωδικοποίηση, ρίξτε το αρχείο στο Mojibuster: την εντοπίζει και αποθηκεύει το αρχείο ως UTF-8.

αβ αντί για αβ στο DataFrame

Αν το DataFrame δείχνει αβ, ένα αρχείο UTF-8 διαβάστηκε ως latin-1 ή cp1252 – ή τα δεδομένα ήταν ήδη χαλασμένα. Στην πρώτη περίπτωση αρκεί encoding='utf-8'. Αν τα ίδια τα δεδομένα είναι χαλασμένα, για μεμονωμένες τιμές βοηθά το timi.encode('cp1252').decode('utf-8'). Σε μικτά δεδομένα όμως αποτυγχάνει μόλις ένα κελί είναι ήδη σωστό. Ευκολότερο: επισκευάστε το αρχείο με το Mojibuster και μετά διαβάστε το.

Ένα CSV από pandas, ανοιγμένο στο Excel χωρίς BOM

Πριν

onoma,poli,tziros
ÃéÜííçò ÊùóôÜêçò,ÁèÞíá,1250 €
ÅëÝíç ÐáððÜ,Èåóóáëïíßêç,980 €

Μετά

onoma,poli,tziros
Γιάννης Κωστάκης,Αθήνα,1250 €
Ελένη Παππά,Θεσσαλονίκη,980 €

to_csv: το Excel δείχνει το αρχείο λάθος

Το df.to_csv('exodos.csv') γράφει UTF-8 χωρίς BOM. Το Excel ανοίγει τέτοια αρχεία ως ANSI και τα ελληνικά γράμματα χαλούν. Με encoding='utf-8-sig' το pandas γράφει BOM και το Excel αναγνωρίζει το UTF-8. Περισσότερα στο Excel και ελληνικά.

open() στα Windows

Το open('arxeio.txt') χωρίς encoding χρησιμοποιεί στα Windows την κωδικοποίηση του συστήματος, στα ελληνικά Windows συνήθως cp1253. Ένα script που δουλεύει σε Linux διαβάζει τότε το ίδιο αρχείο UTF-8 λάθος. Δηλώνετε λοιπόν πάντα encoding='utf-8' ή ορίστε τη μεταβλητή περιβάλλοντος PYTHONUTF8=1. Με το PEP 686 το UTF-8 θα γίνει έτσι κι αλλιώς προεπιλογή σε μελλοντικές εκδόσεις Python.

Δεδομένα web με requests

Το requests εξάγει το response.text από την κεφαλίδα Content-Type. Αν μια απάντηση κειμένου δεν δηλώνει εκεί σύνολο χαρακτήρων, υποθέτει ISO-8859-1 και οι σελίδες UTF-8 δείχνουν αβ. Ορίστε πρώτα response.encoding = 'utf-8' ή χρησιμοποιήστε το response.json(), που αναγνωρίζει μόνο του το UTF-8.

Αν το κείμενο γράφτηκε με errors='replace' σε κωδικοποίηση χωρίς τους απαιτούμενους χαρακτήρες, το αρχείο περιέχει ? – τότε η πληροφορία έχει χαθεί, δείτε Τι είναι το mojibake.

Συχνές ερωτήσεις

Υπάρχει βιβλιοθήκη Python γι' αυτό;

Ναι, η ftfy διορθώνει το mojibake μέσα στον κώδικα Python. Για μεμονωμένα αρχεία χωρίς προγραμματισμό, το Mojibuster είναι πιο γρήγορο και δείχνει κάθε αλλαγή πριν την αποθήκευση.

Ποιες τιμές encoding χρειάζομαι συχνότερα;

utf-8, utf-8-sig (UTF-8 με BOM), cp1253 (Windows, ελληνικά), iso-8859-7, latin-1 και utf-16. Κεφαλαία και παύλες δεν παίζουν ρόλο.

Διατηρούνται οι διαχωριστές και οι αριθμοί;

Ναι. Το Mojibuster αλλάζει μόνο τους χαλασμένους χαρακτήρες. Κόμματα, εισαγωγικά και αλλαγές γραμμής μένουν ακριβώς όπως ήταν.

Περισσότεροι οδηγοί