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