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 –cp1252ist 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.
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.