Popravak kodiranja znakova u Pythonu i pandasu

pandas čita ÄŤ umjesto č, staje s UnicodeDecodeError ili Excel pogrešno prikazuje vaš izvezeni CSV? U Pythonu parametar encoding odlučuje između ispravnog i pokvarenog. Evo tipičnih slučajeva – a pokvarene datoteke možete popraviti u pregledniku iznad.

Radi s tekstom i datotekama:

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

Na primjer izvozi iz Excela, ispisi baza podataka, titlovi za filmove ili kod web-stranica.

Popravi

  1. Povucite datoteku ili zalijepite tekst
  2. Popravak se odvija automatski
  3. Kopirajte ili preuzmite
ili jednostavno povucite datoteku ovamo

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; od cp1250 razlikuje se uglavnom kod š i ž.
  • encoding='latin-1' nikad ne javlja grešku, ali č, ć i š čita pogrešno – za hrvatske datoteke bolji je cp1250.
  • 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.

CSV iz pandasa otvoren u Excelu bez BOM-a

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.

Više uputa