Umlaute in Python und pandas: encoding richtig setzen

pandas liest ä statt ä, bricht mit UnicodeDecodeError ab, oder Excel zeigt deine exportierte CSV falsch an? In Python entscheidet der Parameter encoding über richtig oder kaputt. Hier sind die typischen Fälle – kaputte Dateien reparierst du oben direkt im Browser.

Funktioniert mit Text und diesen Dateien:

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

Zum Beispiel Excel-Exporte, Datenbank-Dumps, Untertitel oder Website-Code.

Reparieren

  1. Datei ablegen oder Text einfügen
  2. Wird automatisch repariert
  3. Kopieren oder herunterladen
oder Datei einfach hierher ziehen

UnicodeDecodeError beim Einlesen

pd.read_csv erwartet UTF-8. Ist die Datei in Windows-1252 (ANSI) gespeichert, bricht pandas mit UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 ab – 0xE4 ist das ä in Windows-1252. Gib die Kodierung dann an:

  • pd.read_csv('daten.csv', encoding='cp1252') für Dateien aus Excel und Windows.
  • encoding='latin-1' bricht nie ab, liest aber € und typografische Anführungszeichen falsch – cp1252 ist meist die bessere Wahl.
  • Kennst du die Kodierung nicht, zieh die Datei in Mojibuster: Es erkennt sie und speichert die Datei als UTF-8.

ä statt ä im DataFrame

Steht im DataFrame ä, wurde eine UTF-8-Datei als latin-1 oder cp1252 gelesen – oder die Daten waren schon vorher kaputt. Im ersten Fall genügt encoding='utf-8'. Sind die Daten selbst kaputt, hilft für einzelne Werte wert.encode('cp1252').decode('utf-8'). Bei gemischten Daten bricht das aber ab, sobald eine Zelle schon richtig ist. Einfacher: die Datei mit Mojibuster reparieren und dann einlesen.

Eine CSV aus pandas, in Excel ohne BOM geöffnet

Vorher

name,stadt,umsatz
Renée Groß,München,1250 €
Jörg Weiß,Zürich,980 €

Nachher

name,stadt,umsatz
Renée Groß,München,1250 €
Jörg Weiß,Zürich,980 €

to_csv: Excel zeigt die Datei falsch an

df.to_csv('export.csv') schreibt UTF-8 ohne BOM. Excel öffnet solche Dateien als ANSI, Umlaute werden zu ä. Mit encoding='utf-8-sig' schreibt pandas eine BOM, und Excel erkennt UTF-8. Mehr unter Excel zeigt Umlaute falsch.

open() unter Windows

open('datei.txt') ohne encoding nutzt unter Windows die Systemkodierung, meist cp1252. Ein Skript, das unter Linux funktioniert, liest dieselbe UTF-8-Datei unter Windows dann als ä. Gib deshalb immer encoding='utf-8' an oder setze die Umgebungsvariable PYTHONUTF8=1. Mit PEP 686 wird UTF-8 in künftigen Python-Versionen ohnehin zum Standard.

Webdaten mit requests

requests leitet response.text aus dem Content-Type-Header ab. Fehlt dort bei einer Textantwort der Zeichensatz, nimmt es ISO-8859-1 an, und UTF-8-Seiten zeigen ä. Setze vorher response.encoding = 'utf-8' oder nutze response.json(), das UTF-8 selbst erkennt.

Wurde Text mit errors='replace' in eine Kodierung ohne Umlaute geschrieben, stehen in der Datei ? – dann ist die Information verloren, siehe Fragezeichen statt Umlaute.

Häufige Fragen

Gibt es eine Python-Bibliothek dafür?

Ja, ftfy repariert Mojibake in Python-Code. Für einzelne Dateien ohne Programmieren ist Mojibuster schneller und zeigt dir jede Änderung vor dem Speichern.

Welche encoding-Werte brauche ich am häufigsten?

utf-8, utf-8-sig (UTF-8 mit BOM), cp1252 (Windows, westeuropäisch), latin-1 und utf-16. Groß- und Kleinschreibung sowie Bindestriche spielen keine Rolle.

Bleiben Trennzeichen und Zahlen erhalten?

Ja. Mojibuster ändert nur kaputte Zeichen. Kommas, Anführungszeichen und Zeilenumbrüche bleiben exakt erhalten.

Weitere Anleitungen