Korjaa merkistökoodaus Pythonissa ja pandasissa

Lukeeko pandas ä merkin ä sijaan, pysähtyykö se UnicodeDecodeError-virheeseen, vai näyttääkö Excel viemäsi CSV:n väärin? Pythonissa encoding-parametri ratkaisee, onnistuuko vai ei. Tässä tyypilliset tapaukset – ja rikkinäiset tiedostot voit korjata selaimessa yllä.

Toimii tekstin ja näiden tiedostojen kanssa:

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

Esimerkiksi Excel-viennit, tietokantavarmuuskopiot, tekstitykset tai verkkosivujen koodi.

Korjaa

  1. Pudota tiedosto tai liitä teksti
  2. Korjaus tapahtuu automaattisesti
  3. Kopioi tai lataa
tai pudota tiedosto tähän

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 – cp1252 on 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.

Pandasin tekemä CSV avattuna Excelissä ilman BOM-merkkiä

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.

Lue lisää