Popravek kodiranja znakov v Pythonu in pandasu

pandas bere ÄŤ namesto č, se ustavi z UnicodeDecodeError ali Excel narobe prikaže vaš izvožen CSV? V Pythonu parameter encoding odloči med pravilnim in pokvarjenim. Tu so tipični primeri – pokvarjene datoteke pa lahko popravite v brskalniku zgoraj.

Deluje z besedilom in datotekami:

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

Na primer izvozi iz Excela, izpisi baz podatkov, podnapisi za filme ali koda spletnih strani.

Popravi

  1. Povlecite datoteko ali prilepite besedilo
  2. Popravilo poteka samodejno
  3. Kopirajte ali prenesite
ali datoteko preprosto povlecite sem

UnicodeDecodeError pri branju

pd.read_csv pričakuje UTF-8. Če je datoteka shranjena v Windows-1250 (ANSI), se pandas ustavi: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 … invalid continuation byte – 0xE8 je v Windows-1250 č. Takrat navedite kodiranje:

  • pd.read_csv('podatki.csv', encoding='cp1250') za datoteke iz Excela in Windowsa.
  • encoding='iso-8859-2' ustreza starejšim datotekam iz Linuxa ali spletnih sistemov; od cp1250 se razlikuje predvsem pri š in ž.
  • encoding='latin-1' nikoli ne javi napake, vendar č, š in ž bere narobe – za slovenske datoteke je boljši cp1250.
  • Če kodiranja ne poznate, povlecite datoteko v Mojibuster: ga prepozna in datoteko shrani kot UTF-8.

ÄŤ namesto č v DataFrameu

Če DataFrame kaže ÄŤ, je bila datoteka UTF-8 prebrana kot cp1250 ali latin-1 – ali pa so bili podatki pokvarjeni že prej. V prvem primeru zadošča encoding='utf-8'. Če so pokvarjeni sami podatki, za posamezne vrednosti pomaga vrednost.encode('cp1250').decode('utf-8'). Pri mešanih podatkih pa odpove, takoj ko je kakšna celica že pravilna. Preprosteje: datoteko popravite z Mojibusterjem in jo šele nato preberite.

CSV iz pandasa, odprt v Excelu brez BOM-a

Prej

ime,mesto,prihodek
Črt Žagar,Žalec,1250 €
Nataša Čebron,Kranj,980 €

Potem

ime,mesto,prihodek
Črt Žagar,Žalec,1250 €
Nataša Čebron,Kranj,980 €

to_csv: Excel datoteko prikaže narobe

df.to_csv('izvoz.csv') piše UTF-8 brez BOM-a. Excel takšne datoteke odpre kot ANSI in šumniki se pokvarijo. Z encoding='utf-8-sig' pandas zapiše BOM in Excel prepozna UTF-8. Več na strani o CSV-ju in šumnikih v Excelu.

open() v Windowsu

open('datoteka.txt') brez encoding v Windowsu uporablja kodiranje sistema, pri slovenskih nastavitvah običajno cp1250. Skripta, ki deluje v Linuxu, potem isto datoteko UTF-8 v Windowsu prebere narobe. Zato vedno navedite encoding='utf-8' ali nastavite okoljsko spremenljivko PYTHONUTF8=1. Po PEP-u 686 bo UTF-8 v prihodnjih različicah Pythona itak privzet.

Spletni podatki z requests

requests izpelje response.text iz glave Content-Type. Če besedilni odgovor tam ne navede nabora znakov, predpostavi ISO-8859-1 in strani UTF-8 kažejo ÄŤ. Najprej nastavite response.encoding = 'utf-8' ali uporabite response.json(), ki UTF-8 prepozna sam.

Če je bilo besedilo z errors='replace' zapisano v kodiranje brez potrebnih znakov, datoteka vsebuje ? – takrat je informacija izgubljena. Ozadje razlaga stran kaj je mojibake.

Pogosta vprašanja

Ali obstaja Pythonova knjižnica za to?

Da, ftfy popravlja mojibake v kodi Python. Za posamezne datoteke brez programiranja je Mojibuster hitrejši in pred shranjevanjem pokaže vsako spremembo.

Katere vrednosti za encoding potrebujem najpogosteje?

utf-8, utf-8-sig (UTF-8 z BOM-om), cp1250 (Windows, srednjeevropski), iso-8859-2, latin-1 in utf-16. Velike in male črke ter vezaji niso pomembni.

Ali ostanejo ločila in številke ohranjena?

Da. Mojibuster spremeni samo pokvarjene znake. Vejice, narekovaji in prelomi vrstic ostanejo natanko takšni, kot so.

Več navodil