Fiks tegnkoding i Python og pandas

Leser pandas ø i stedet for ø, stopper med en UnicodeDecodeError, eller viser Excel den eksporterte CSV-en feil? I Python avgjør parameteren encoding om det blir riktig eller galt. Her er de typiske tilfellene – og ødelagte filer kan du reparere i nettleseren ovenfor.

Fungerer med tekst og med disse filene:

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

For eksempel eksporter fra Excel, databasesikkerhetskopier, undertekster eller kode fra nettsider.

Fiks

  1. Dra en fil hit eller lim inn tekst
  2. Fiksingen skjer automatisk
  3. Kopier eller last ned
eller dra en fil hit

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 – cp1252 er 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å.

En CSV fra pandas, åpnet i Excel uten BOM

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.

Les mer