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; odcp1250se razlikuje predvsem prišinž.encoding='latin-1'nikoli ne javi napake, vendarč,šinžbere narobe – za slovenske datoteke je boljšicp1250.- Č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.
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.