Tekencodering herstellen in Python en pandas

Leest pandas é in plaats van é, stopt het met een UnicodeDecodeError, of toont Excel je geëxporteerde CSV verkeerd? In Python bepaalt de parameter encoding of het goed gaat. Hier staan de typische gevallen, en kapotte bestanden herstel je hierboven in je browser.

Werkt met tekst en met deze bestanden:

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

Bijvoorbeeld exports uit Excel, databaseback-ups, ondertitels of websitecode.

Herstellen

  1. Sleep een bestand hierheen of plak tekst
  2. Het herstellen gaat automatisch
  3. Kopieer of download
of sleep een bestand hierheen

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; cp1252 is 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.

Een CSV uit pandas, in Excel geopend zonder BOM

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.

Meer uitleg