UnicodeDecodeError bij het lezen
pd.read_csv verwacht UTF-8. Is het bestand opgeslagen in Windows-1252 (ANSI), dan stopt pandas met UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9; 0xE9 is é in Windows-1252. Geef dan de codering op:
pd.read_csv('data.csv', encoding='cp1252')voor bestanden uit Excel en Windows.encoding='latin-1'mislukt nooit, maar leest€en typografische aanhalingstekens verkeerd;cp1252is meestal de betere keuze.- Weet je de codering niet, sleep het bestand dan naar Mojibuster: het herkent de codering en slaat het bestand op als UTF-8.
é in plaats van é in het DataFrame
Toont het DataFrame é, dan is een UTF-8-bestand gelezen als latin-1 of cp1252, of de data was al kapot. In het eerste geval volstaat encoding='utf-8'. Is de data zelf kapot, dan helpt waarde.encode('cp1252').decode('utf-8') bij losse waarden. Bij gemengde data mislukt dat zodra een cel al goed is. Makkelijker: herstel het bestand met Mojibuster en lees het daarna in.
Voor
naam,woonplaats,omzet Zoë de Bruijn,Genève,1250 € Renée Müller,Doetinchem,980 €
Na
naam,woonplaats,omzet Zoë de Bruijn,Genève,1250 € Renée Müller,Doetinchem,980 €
to_csv: Excel toont het bestand verkeerd
df.to_csv('export.csv') schrijft UTF-8 zonder BOM. Excel opent zulke bestanden als ANSI en letters met accenten worden é. Met encoding='utf-8-sig' schrijft pandas een BOM en herkent Excel UTF-8. Meer over Excel dat rare tekens toont.
open() onder Windows
open('bestand.txt') zonder encoding gebruikt onder Windows de systeemcodering, meestal cp1252. Een script dat op Linux werkt, leest hetzelfde UTF-8-bestand onder Windows dan als é. Geef dus altijd encoding='utf-8' op of zet de omgevingsvariabele PYTHONUTF8=1. Met PEP 686 wordt UTF-8 in toekomstige Python-versies sowieso de standaard.
Webdata met requests
requests leidt response.text af uit de Content-Type-header. Staat daar bij een tekstantwoord geen tekenset, dan gaat het uit van ISO-8859-1 en tonen UTF-8-pagina’s é. Zet eerst response.encoding = 'utf-8', of gebruik response.json(), dat UTF-8 zelf herkent.
Is tekst met errors='replace' weggeschreven naar een codering zonder de benodigde tekens, dan bevat het bestand ?. De informatie is dan verloren, zie vraagtekens in plaats van letters.
Veelgestelde vragen
Is er een Python-bibliotheek hiervoor?
Ja, ftfy herstelt mojibake in Python-code. Voor losse bestanden zonder programmeren is Mojibuster sneller en toont het elke wijziging voordat je opslaat.
Welke encoding-waarden heb ik het vaakst nodig?
utf-8, utf-8-sig (UTF-8 met BOM), cp1252 (Windows, West-Europees), latin-1 en utf-16. Hoofdletters en streepjes maken niet uit.
Blijven scheidingstekens en getallen behouden?
Ja. Mojibuster wijzigt alleen kapotte tekens. Komma’s, aanhalingstekens en regeleinden blijven precies zoals ze zijn.