UnicodeDecodeError ved innlesing
pd.read_csv forventer UTF-8. Er filen lagret i Windows-1252 (ANSI), stopper pandas med UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf8 – 0xF8 er ø i Windows-1252. Oppgi da kodingen:
pd.read_csv('data.csv', encoding='cp1252')for filer fra Excel og Windows.encoding='latin-1'feiler aldri, men leser€og typografiske anførselstegn feil –cp1252er som regel bedre.- Kjenner du ikke kodingen, slipper du filen i Mojibuster: den finner den og lagrer filen som UTF-8.
ø i stedet for ø i DataFrame
Viser DataFrame ø, er en UTF-8-fil lest som latin-1 eller cp1252 – eller dataene var ødelagt fra før. I det første tilfellet holder encoding='utf-8'. Er dataene selv ødelagt, hjelper verdi.encode('cp1252').decode('utf-8') for enkeltverdier. Med blandede data feiler det derimot så snart en celle allerede er riktig. Enklere: reparer filen med Mojibuster og les den etterpå.
Før
navn,by,omsetning Bjørn Æreberg,Ålesund,1250 kr Åse Haugerød,Tromsø,980 kr
Etter
navn,by,omsetning Bjørn Æreberg,Ålesund,1250 kr Åse Haugerød,Tromsø,980 kr
to_csv: Excel viser filen feil
df.to_csv('export.csv') skriver UTF-8 uten BOM. Excel åpner slike filer som ANSI, og æøå blir til æøå. Med encoding='utf-8-sig' skriver pandas en BOM, og Excel gjenkjenner UTF-8. Mer under Excel viser rare tegn og CSV med rare tegn.
open() på Windows
open('fil.txt') uten encoding bruker systemkodingen på Windows, som regel cp1252. Et skript som fungerer på Linux, leser da den samme UTF-8-filen som ø på Windows. Oppgi derfor alltid encoding='utf-8', eller sett miljøvariabelen PYTHONUTF8=1. Med PEP 686 blir UTF-8 uansett standard i kommende Python-versjoner.
Nettdata med requests
requests utleder response.text fra headeren Content-Type. Oppgir et tekstsvar ikke tegnsett der, antar den ISO-8859-1, og UTF-8-sider viser ø. Sett først response.encoding = 'utf-8', eller bruk response.json(), som selv gjenkjenner UTF-8.
Ble tekst skrevet med errors='replace' til en koding uten de nødvendige tegnene, inneholder filen ? – da er informasjonen tapt, se spørsmålstegn i stedet for bokstaver.
Ofte stilte spørsmål
Finnes det et Python-bibliotek for dette?
Ja, ftfy fikser mojibake i Python-kode. For enkeltfiler uten programmering er Mojibuster raskere og viser hver endring før du lagrer.
Hvilke encoding-verdier trenger jeg mest?
utf-8, utf-8-sig (UTF-8 med BOM), cp1252 (Windows, vesteuropeisk), latin-1 og utf-16. Store og små bokstaver og bindestreker spiller ingen rolle.
Blir skilletegn og tall bevart?
Ja. Mojibuster endrer bare ødelagte tegn. Komma, anførselstegn og linjeskift blir stående nøyaktig som de er.