UnicodeDecodeError při čtení
pd.read_csv očekává UTF-8. Pokud je soubor uložený ve Windows-1250 (ANSI v české verzi Windows), pandas skončí chybou UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 – 0xE8 je č ve Windows-1250. Pak kódování uveďte:
pd.read_csv('data.csv', encoding='cp1250')pro soubory z Excelu a Windows.encoding='iso-8859-2'pro starší soubory z unixových systémů a webů.- Pokud kódování neznáte, přetáhněte soubor do Mojibusteru: pozná ho a uloží soubor jako UTF-8.
Ä› místo ě v DataFrame
Pokud DataFrame ukazuje Ä›, byl soubor v UTF-8 přečten jako cp1250 nebo latin-1 – nebo byla data rozbitá už dřív. V prvním případě stačí encoding='utf-8'. Pokud jsou rozbitá samotná data, u jednotlivých hodnot pomůže hodnota.encode('cp1250').decode('utf-8'). U smíšených dat to ale selže, jakmile je některá buňka už správně. Snazší: soubor opravit v Mojibusteru a teprve potom načíst.
Před
jmeno,mesto,obrat Jiřà Dvořák,TĹ™ebĂÄŤ,1250 KÄŤ ZdenÄ›k ÄŚernĂ˝,Brno,980 KÄŤ
Po
jmeno,mesto,obrat Jiří Dvořák,Třebíč,1250 Kč Zdeněk Černý,Brno,980 Kč
to_csv: Excel soubor zobrazí špatně
df.to_csv('export.csv') zapisuje UTF-8 bez BOM. Excel takové soubory otevře jako ANSI a písmena s diakritikou se změní na Ä› a Ĺ™. S encoding='utf-8-sig' pandas zapíše BOM a Excel UTF-8 pozná. Víc o Excelu a rozsypaném čaji v CSV.
open() ve Windows
open('soubor.txt') bez encoding používá ve Windows systémové kódování, v české verzi obvykle cp1250. Skript, který funguje v Linuxu, pak stejný soubor UTF-8 ve Windows přečte jako Ä›. Proto vždy uvádějte encoding='utf-8' nebo nastavte proměnnou prostředí PYTHONUTF8=1. Podle PEP 686 se UTF-8 v budoucích verzích Pythonu stane výchozím.
Webová data a requests
requests odvozuje response.text z hlavičky Content-Type. Pokud textová odpověď znakovou sadu neuvádí, předpokládá se ISO-8859-1 a stránky v UTF-8 ukazují Ä›. Nejdřív nastavte response.encoding = 'utf-8' nebo použijte response.json(), které UTF-8 pozná samo.
Pokud byl text zapsán s errors='replace' do kódování bez potřebných písmen, soubor obsahuje ? – informace je pak ztracena, viz co je mojibake.
Časté otázky
Existuje na to knihovna pro Python?
Ano, ftfy opravuje mojibake v kódu Pythonu. U jednotlivých souborů bez programování je Mojibuster rychlejší a před uložením ukáže každou změnu.
Které hodnoty encoding potřebuji nejčastěji?
utf-8, utf-8-sig (UTF-8 s BOM), cp1250 (Windows, střední Evropa), iso-8859-2, latin-1 a utf-16. Na velikosti písmen a pomlčkách nezáleží.
Zůstanou oddělovače a čísla zachovány?
Ano. Mojibuster mění jen rozbité znaky. Čárky, uvozovky a zalomení řádků zůstanou přesně tak, jak byly.