Oprava slovenskej diakritiky v Pythone a pandas

pandas číta ľ namiesto ľ, skončí chybou UnicodeDecodeError alebo Excel zle zobrazuje exportované CSV? V Pythone o všetkom rozhoduje parameter encoding. Tu sú typické prípady – a pokazené súbory opravíte priamo v prehliadači vyššie.

Funguje s textom aj súbormi:

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

Napríklad exporty z Excelu, výpisy databáz, titulky alebo kód webových stránok.

Opraviť

  1. Pretiahnite súbor alebo vložte text
  2. Oprava prebehne automaticky
  3. Skopírujte alebo stiahnite
alebo súbor jednoducho pretiahnite sem

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ť.

CSV z pandas otvorené v Exceli bez BOM

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.

Ďalšie návody