UnicodeDecodeError pri čítaní
pd.read_csv očakáva UTF-8. Ak je súbor uložený vo Windows-1250 (ANSI v slovenskej verzii Windows), pandas skončí chybou UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 – 0xE8 je č vo Windows-1250. Potom kódovanie uveďte:
pd.read_csv('data.csv', encoding='cp1250')pre súbory z Excelu a Windows.encoding='iso-8859-2'pre staršie súbory z unixových systémov a webov.- Ak kódovanie nepoznáte, presuňte súbor do Mojibusteru: spozná ho a uloží súbor ako UTF-8.
ľ namiesto ľ v DataFrame
Ak DataFrame ukazuje ľ, bol súbor v UTF-8 prečítaný ako cp1250 alebo latin-1 – alebo boli dáta pokazené už skôr. V prvom prípade stačí encoding='utf-8'. Ak sú pokazené samotné dáta, pri jednotlivých hodnotách pomôže hodnota.encode('cp1250').decode('utf-8'). Pri zmiešaných dátach to však zlyhá, hneď ako je niektorá bunka už správne. Jednoduchšie: súbor opraviť v Mojibusteri a až potom načítať.
Pred
meno,mesto,obrat Ján Kováč,Žilina,1250 € Ľudmila Horváthová,Košice,980 €
Po
meno,mesto,obrat Ján Kováč,Žilina,1250 € Ľudmila Horváthová,Košice,980 €
to_csv: Excel súbor zobrazí zle
df.to_csv('export.csv') zapisuje UTF-8 bez BOM. Excel takéto súbory otvorí ako ANSI a písmená s diakritikou sa zmenia na ľ a ÄŤ. S encoding='utf-8-sig' pandas zapíše BOM a Excel UTF-8 spozná. Viac o Exceli a rozsypanom čaji v CSV.
open() vo Windows
open('subor.txt') bez encoding používa vo Windows systémové kódovanie, v slovenskej verzii zvyčajne cp1250. Skript, ktorý funguje v Linuxe, potom ten istý súbor UTF-8 vo Windows prečíta ako ľ. Preto vždy uvádzajte encoding='utf-8' alebo nastavte premennú prostredia PYTHONUTF8=1. Podľa PEP 686 sa UTF-8 v budúcich verziách Pythonu stane predvoleným.
Webové dáta a requests
requests odvodzuje response.text z hlavičky Content-Type. Ak textová odpoveď znakovú sadu neuvádza, predpokladá sa ISO-8859-1 a stránky v UTF-8 ukazujú ľ. Najprv nastavte response.encoding = 'utf-8' alebo použite response.json(), ktoré UTF-8 spozná samo.
Ak bol text zapísaný s errors='replace' do kódovania bez potrebných písmen, súbor obsahuje ? – informácia je potom stratená, pozri čo je mojibake.
Časté otázky
Existuje na to knižnica pre Python?
Áno, ftfy opravuje mojibake v kóde Pythonu. Pri jednotlivých súboroch bez programovania je Mojibuster rýchlejší a pred uložením ukáže každú zmenu.
Ktoré hodnoty encoding potrebujem najčastejšie?
utf-8, utf-8-sig (UTF-8 s BOM), cp1250 (Windows, stredná Európa), iso-8859-2, latin-1 a utf-16. Na veľkosti písmen a pomlčkách nezáleží.
Zostanú oddeľovače a čísla zachované?
Áno. Mojibuster mení iba pokazené znaky. Čiarky, úvodzovky a zalomenia riadkov ostanú presne také, aké boli.