UnicodeDecodeError pri čitanju
pd.read_csv očekuje UTF-8. Ako je datoteka spremljena u Windows-1250 (ANSI), pandas staje: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 … invalid continuation byte – 0xE8 je u Windows-1250 č. Tada navedite kodiranje:
pd.read_csv('podaci.csv', encoding='cp1250')za datoteke iz Excela i Windowsa.encoding='iso-8859-2'odgovara starijim datotekama iz Linuxa ili web sustava; odcp1250razlikuje se uglavnom kodšiž.encoding='latin-1'nikad ne javlja grešku, alič,ćiščita pogrešno – za hrvatske datoteke bolji jecp1250.- Ako ne znate kodiranje, povucite datoteku u Mojibuster: prepoznat će ga i spremiti datoteku kao UTF-8.
ÄŤ umjesto č u DataFrameu
Ako DataFrame prikazuje ÄŤ, UTF-8 datoteka je pročitana kao cp1250 ili latin-1 – ili su podaci pokvareni već prije. U prvom slučaju dovoljan je encoding='utf-8'. Ako su sami podaci pokvareni, za pojedinačne vrijednosti pomaže vrijednost.encode('cp1250').decode('utf-8'). Kod miješanih podataka to ipak ne uspijeva čim je neka ćelija već ispravna. Jednostavnije: popravite datoteku Mojibusterom, pa je tek onda učitajte.
Prije
ime,grad,prihod Željko Čačić,Osijek,1250 kn Ivana Kučić,Zadar,980 kn
Poslije
ime,grad,prihod Željko Čačić,Osijek,1250 kn Ivana Kučić,Zadar,980 kn
to_csv: Excel pogrešno prikazuje datoteku
df.to_csv('izvoz.csv') piše UTF-8 bez BOM-a. Excel takve datoteke otvara kao ANSI i kvačice se pokvare. S encoding='utf-8-sig' pandas piše BOM i Excel prepoznaje UTF-8. Više na stranici o CSV-u i kvačicama u Excelu.
open() na Windowsu
open('datoteka.txt') bez encoding na Windowsu koristi kodiranje sustava, na hrvatskim postavkama obično cp1250. Skripta koja radi na Linuxu tada istu UTF-8 datoteku na Windowsu čita pogrešno. Zato uvijek navedite encoding='utf-8' ili postavite varijablu okruženja PYTHONUTF8=1. Prema PEP-u 686 UTF-8 će u budućim verzijama Pythona ionako postati zadan.
Web podaci s requestsom
requests izvodi response.text iz zaglavlja Content-Type. Ako tekstualni odgovor tamo ne navodi skup znakova, pretpostavlja ISO-8859-1 i UTF-8 stranice prikazuju ÄŤ. Prvo postavite response.encoding = 'utf-8' ili koristite response.json(), koji UTF-8 sam prepoznaje.
Ako je tekst s errors='replace' zapisan u kodiranje bez potrebnih znakova, datoteka sadrži ? – tada je informacija izgubljena. Pozadinu objašnjava stranica što je mojibake.
Česta pitanja
Postoji li Python biblioteka za ovo?
Da, ftfy popravlja mojibake u Python kodu. Za pojedinačne datoteke bez programiranja Mojibuster je brži i prije spremanja pokazuje svaku promjenu.
Koje vrijednosti za encoding najčešće trebam?
utf-8, utf-8-sig (UTF-8 s BOM-om), cp1250 (Windows, srednjoeuropski), iso-8859-2, latin-1 i utf-16. Velika i mala slova te crtice nisu bitni.
Ostaju li razdjelnici i brojevi sačuvani?
Da. Mojibuster mijenja samo pokvarene znakove. Zarezi, navodnici i prijelomi redaka ostaju točno onakvi kakvi jesu.