Laga teckenkodning i Python och pandas

Läser pandas ä i stället för ä, stannar med ett UnicodeDecodeError, eller visar Excel din exporterade CSV fel? I Python avgör parametern encoding mellan rätt och fel. Här är de typiska fallen – och trasiga filer lagar du i webbläsaren ovan.

Fungerar med text och med de här filerna:

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

Till exempel exporter från Excel, databasbackuper, undertexter eller webbplatskod.

Fixa

  1. Dra hit en fil eller klistra in text
  2. Fixen sker automatiskt
  3. Kopiera eller ladda ner
eller dra hit en fil

UnicodeDecodeError vid inläsning

pd.read_csv förväntar sig UTF-8. Är filen sparad i Windows-1252 (ANSI) stannar pandas med UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 – 0xE4 är ä i Windows-1252. Ange då kodningen:

  • pd.read_csv('data.csv', encoding='cp1252') för filer från Excel och Windows.
  • encoding='latin-1' misslyckas aldrig, men läser € och typografiska citattecken fel – cp1252 är oftast bättre.
  • Vet du inte kodningen, släpp filen i Mojibuster: den identifierar den och sparar filen som UTF-8.

ä i stället för ä i DataFrame

Visar DataFrame ä har en UTF-8-fil lästs som latin-1 eller cp1252 – eller så var datan trasig redan innan. I det första fallet räcker encoding='utf-8'. Är datan själv trasig hjälper varde.encode('cp1252').decode('utf-8') för enstaka värden. Med blandad data misslyckas det dock så fort en cell redan är korrekt. Enklare: laga filen med Mojibuster och läs den sedan.

En CSV från pandas, öppnad i Excel utan BOM

Före

namn,ort,omsättning
Åsa Lindström,Göteborg,1250 kr
Björn Öberg,Västerås,980 kr

Efter

namn,ort,omsättning
Åsa Lindström,Göteborg,1250 kr
Björn Öberg,Västerås,980 kr

to_csv: Excel visar filen fel

df.to_csv('export.csv') skriver UTF-8 utan BOM. Excel öppnar sådana filer som ANSI, och åäö blir åäö. Med encoding='utf-8-sig' skriver pandas en BOM och Excel känner igen UTF-8. Mer under Excel visar konstiga tecken och CSV med konstiga tecken.

open() på Windows

open('fil.txt') utan encoding använder systemets kodning på Windows, oftast cp1252. Ett skript som fungerar på Linux läser då samma UTF-8-fil som ä på Windows. Ange därför alltid encoding='utf-8' eller sätt miljövariabeln PYTHONUTF8=1. Med PEP 686 blir UTF-8 standard i kommande Python-versioner ändå.

Webbdata med requests

requests härleder response.text från headern Content-Type. Anger ett textsvar ingen teckenuppsättning där antar den ISO-8859-1, och UTF-8-sidor visar ä. Sätt först response.encoding = 'utf-8', eller använd response.json(), som själv känner igen UTF-8.

Skrevs text med errors='replace' till en kodning utan de nödvändiga tecknen innehåller filen ? – då är informationen förlorad, se frågetecken i stället för åäö.

Vanliga frågor

Finns det ett Python-bibliotek för det här?

Ja, ftfy lagar mojibake i Python-kod. För enstaka filer utan programmering går Mojibuster snabbare och visar varje ändring innan du sparar.

Vilka encoding-värden behöver jag oftast?

utf-8, utf-8-sig (UTF-8 med BOM), cp1252 (Windows, västeuropeiska), latin-1 och utf-16. Versaler och bindestreck spelar ingen roll.

Bevaras avgränsare och siffror?

Ja. Mojibuster ändrar bara trasiga tecken. Kommatecken, citattecken och radbrytningar förblir exakt som de är.

Mer att läsa