Oprava české diakritiky v Pythonu a pandas

pandas čte Ä› místo ě, skončí chybou UnicodeDecodeError nebo Excel špatně zobrazuje exportované CSV? V Pythonu rozhoduje o všem parametr encoding. Tady jsou typické případy – a rozbité soubory opravíte přímo v prohlížeči výše.

Funguje s textem a soubory:

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

Například exporty z Excelu, výpisy databází, titulky nebo kód webových stránek.

Opravit

  1. Přetáhněte soubor nebo vložte text
  2. Oprava proběhne automaticky
  3. Zkopírujte nebo stáhněte
nebo soubor jednoduše přetáhněte sem

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.

CSV z pandas otevřené v Excelu bez BOM

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.

Další návody