UnicodeDecodeError olvasáskor
A pd.read_csv UTF-8-ra számít. Ha a fájl Windows-1250 (ANSI) kódolású, a pandas megáll: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe1 … invalid continuation byte – a 0xE1 a Windows-1250-ben á. Ilyenkor add meg a kódolást:
pd.read_csv('adatok.csv', encoding='cp1250')az Excelből és Windowsról származó fájlokhoz.- Az
encoding='iso-8859-2'régebbi, Linuxon vagy webes rendszerekben készült magyar fájlokhoz való; acp1250-től főleg aőésűkörnyékén tér el. - Az
encoding='latin-1'sosem hibázik, de a magyarőésűbetűket rosszul olvassa – magyar fájlhoz acp1250a jobb választás. - Ha nem tudod a kódolást, húzd a fájlt a Mojibusterbe: felismeri, és UTF-8-ként menti.
Ă© az é helyett a DataFrame-ben
Ha a DataFrame Ă©-t mutat, egy UTF-8 fájlt cp1250-ként vagy latin-1-ként olvastál be – vagy az adat már korábban elromlott. Az első esetben elég az encoding='utf-8'. Ha maga az adat romlott el, egyes értékekre segít a ertek.encode('cp1250').decode('utf-8'). Vegyes adatnál viszont elbukik, amint egy cella már helyes. Egyszerűbb: javítsd meg a fájlt a Mojibusterrel, és utána olvasd be.
Előtte
név,város,bevétel Tóth Béla,Győr,1250 Ft Szűcs Gergő,Pécs,980 Ft
Utána
név,város,bevétel Tóth Béla,Győr,1250 Ft Szűcs Gergő,Pécs,980 Ft
to_csv: az Excel rosszul mutatja a fájlt
A df.to_csv('export.csv') BOM nélküli UTF-8-at ír. Az Excel az ilyen fájlokat ANSI-ként nyitja meg, és az ékezetes betűk elromlanak. Az encoding='utf-8-sig' megadásával a pandas BOM-ot ír, és az Excel felismeri az UTF-8-at. Többet az Excel CSV ékezetes betűiről szóló oldalon találsz.
open() Windowson
Az encoding nélküli open('fajl.txt') Windowson a rendszer kódolását használja, magyar beállításnál általában cp1250-et. Egy Linuxon működő szkript Windowson ugyanazt az UTF-8 fájlt rosszul olvassa. Ezért mindig add meg az encoding='utf-8' értéket, vagy állítsd be a PYTHONUTF8=1 környezeti változót. A PEP 686 szerint a későbbi Python-verziókban az UTF-8 amúgy is alapértelmezett lesz.
Webes adatok a requests-szel
A requests a response.text értékét a Content-Type fejlécből vezeti le. Ha egy szöveges válasz nem ad meg karakterkészletet, ISO-8859-1-et feltételez, és az UTF-8 oldalakon Ă©-szerű hibák jelennek meg. Előbb állítsd be a response.encoding = 'utf-8' értéket, vagy használd a response.json() hívást, amely magától felismeri az UTF-8-at.
Ha a szöveg errors='replace' móddal olyan kódolásba íródott, amelyből hiányoznak a szükséges karakterek, a fájlban ? van – ekkor az információ elveszett. A háttérről a mi az a mojibake oldalon olvashatsz.
Gyakori kérdések
Van erre Python-könyvtár?
Igen, az ftfy Python-kódból javítja a mojibake-ot. Egyes fájlokhoz programozás nélkül a Mojibuster gyorsabb, és mentés előtt minden változtatást megmutat.
Melyik encoding-értékekre van a legtöbbször szükségem?
utf-8, utf-8-sig (UTF-8 BOM-mal), cp1250 (Windows, közép-európai), iso-8859-2, latin-1 és utf-16. A kis- és nagybetű, valamint a kötőjelek nem számítanak.
Az elválasztók és a számok megmaradnak?
Igen. A Mojibuster csak a hibás karaktereket változtatja. A vesszők, idézőjelek és sortörések pontosan úgy maradnak, ahogy voltak.