UnicodeDecodeError luettaessa
pd.read_csv odottaa UTF-8:aa. Jos tiedosto on tallennettu Windows-1252:lla (ANSI), pandas pysähtyy virheeseen UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 – 0xE4 on ä Windows-1252:ssa. Ilmoita silloin koodaus:
pd.read_csv('data.csv', encoding='cp1252')Excelistä ja Windowsista tuleville tiedostoille.encoding='latin-1'ei koskaan epäonnistu, mutta lukee€-merkin ja typografiset lainausmerkit väärin –cp1252on yleensä parempi.- Jos et tiedä koodausta, pudota tiedosto Mojibusteriin: se tunnistaa sen ja tallentaa tiedoston UTF-8:na.
ä merkin ä sijaan DataFramessa
Jos DataFrame näyttää ä, UTF-8-tiedosto on luettu latin-1- tai cp1252-koodauksella – tai data oli rikki jo aiemmin. Ensimmäisessä tapauksessa riittää encoding='utf-8'. Jos data itse on rikki, yksittäisille arvoille auttaa arvo.encode('cp1252').decode('utf-8'). Sekalaisella datalla se kuitenkin kaatuu heti, kun jokin solu on jo oikein. Helpompaa: korjaa tiedosto Mojibusterilla ja lue se sitten.
Ennen
nimi,kaupunki,liikevaihto Päivi Ääläinen,Jyväskylä,1250 € Töhö Mäkelä,Hämeenlinna,980 €
Jälkeen
nimi,kaupunki,liikevaihto Päivi Ääläinen,Jyväskylä,1250 € Töhö Mäkelä,Hämeenlinna,980 €
to_csv: Excel näyttää tiedoston väärin
df.to_csv('export.csv') kirjoittaa UTF-8:aa ilman BOM-merkkiä. Excel avaa tällaiset tiedostot ANSI-muodossa, ja ääkköset muuttuvat muotoon äö. Valinnalla encoding='utf-8-sig' pandas kirjoittaa BOM-merkin ja Excel tunnistaa UTF-8:n. Lisää kohdissa Excel näyttää ääkköset väärin ja CSV:n oudot merkit.
open() Windowsissa
open('tiedosto.txt') ilman encoding-parametria käyttää Windowsissa järjestelmän koodausta, yleensä cp1252. Linuxissa toimiva komentosarja lukee silloin saman UTF-8-tiedoston Windowsissa muodossa ä. Anna siksi aina encoding='utf-8' tai aseta ympäristömuuttuja PYTHONUTF8=1. PEP 686:n myötä UTF-8 tulee tulevissa Python-versioissa oletukseksi joka tapauksessa.
Verkkodata requestsilla
requests päättelee response.text-arvon Content-Type-otsakkeesta. Jos tekstivastaus ei ilmoita siinä merkistöä, kirjasto olettaa ISO-8859-1:n ja UTF-8-sivut näyttävät ä. Aseta ensin response.encoding = 'utf-8' tai käytä response.json()-kutsua, joka tunnistaa UTF-8:n itse.
Jos teksti kirjoitettiin valinnalla errors='replace' koodaukseen, josta tarvittavat merkit puuttuvat, tiedostossa on ?-merkkejä – silloin tieto on menetetty, ks. kysymysmerkit kirjainten sijaan.
Usein kysyttyä
Onko tähän Python-kirjastoa?
On, ftfy korjaa mojibaken Python-koodissa. Yksittäisille tiedostoille ilman ohjelmointia Mojibuster on nopeampi ja näyttää jokaisen muutoksen ennen tallennusta.
Mitä encoding-arvoja tarvitsen eniten?
utf-8, utf-8-sig (UTF-8 BOM-merkillä), cp1252 (Windows, länsieurooppalainen), latin-1 ja utf-16. Isoilla ja pienillä kirjaimilla tai tavuviivoilla ei ole väliä.
Säilyvätkö erottimet ja numerot?
Kyllä. Mojibuster muuttaa vain rikkinäisiä merkkejä. Pilkut, lainausmerkit ja rivinvaihdot pysyvät täsmälleen ennallaan.