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 και μετά διαβάστε το.
Πριν
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 αλλάζει μόνο τους χαλασμένους χαρακτήρες. Κόμματα, εισαγωγικά και αλλαγές γραμμής μένουν ακριβώς όπως ήταν.