Ret tegnkodning i Python og pandas

Læser pandas ø i stedet for ø, stopper med en UnicodeDecodeError, eller viser Excel din eksporterede CSV forkert? I Python afgør parameteren encoding, om det går godt eller skidt. Her er de typiske tilfælde – og ødelagte filer kan du reparere i browseren ovenfor.

Virker med tekst og med disse filer:

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

For eksempel eksporter fra Excel, databasebackups, undertekster eller kode fra hjemmesider.

Ret

  1. Træk en fil herind, eller sæt tekst ind
  2. Rettelsen sker automatisk
  3. Kopiér eller download
eller træk en fil herind

UnicodeDecodeError ved indlæsning

pd.read_csv forventer UTF-8. Er filen gemt i Windows-1252 (ANSI), stopper pandas med UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf8 – 0xF8 er ø i Windows-1252. Angiv så kodningen:

  • pd.read_csv('data.csv', encoding='cp1252') til filer fra Excel og Windows.
  • encoding='latin-1' fejler aldrig, men læser € og typografiske anførselstegn forkert – cp1252 er som regel bedre.
  • Kender du ikke kodningen, så slip filen i Mojibuster: den finder den og gemmer filen som UTF-8.

ø i stedet for ø i DataFrame

Viser DataFrame ø, er en UTF-8-fil blevet læst som latin-1 eller cp1252 – eller dataene var ødelagt i forvejen. I det første tilfælde er encoding='utf-8' nok. Er dataene selv ødelagt, hjælper vaerdi.encode('cp1252').decode('utf-8') til enkelte værdier. Ved blandede data fejler det dog, så snart en celle allerede er korrekt. Nemmere: ret filen med Mojibuster og læs den bagefter.

En CSV fra pandas, åbnet i Excel uden BOM

Før

navn,by,omsætning
Søren Ærø,Ålborg,1250 kr
Åse Lindhøj,Næstved,980 kr

Efter

navn,by,omsætning
Søren Ærø,Ålborg,1250 kr
Åse Lindhøj,Næstved,980 kr

to_csv: Excel viser filen forkert

df.to_csv('export.csv') skriver UTF-8 uden BOM. Excel åbner sådanne filer som ANSI, og æøå bliver til æøå. Med encoding='utf-8-sig' skriver pandas en BOM, og Excel genkender UTF-8. Mere under Excel viser mærkelige tegn og CSV med mærkelige tegn.

open() på Windows

open('fil.txt') uden encoding bruger systemets kodning på Windows, som regel cp1252. Et script, der virker på Linux, læser så den samme UTF-8-fil som ø på Windows. Angiv derfor altid encoding='utf-8', eller sæt miljøvariablen PYTHONUTF8=1. Med PEP 686 bliver UTF-8 under alle omstændigheder standard i kommende Python-versioner.

Webdata med requests

requests udleder response.text af headeren Content-Type. Angiver et tekstsvar ikke noget tegnsæt dér, antager den ISO-8859-1, og UTF-8-sider viser ø. Sæt først response.encoding = 'utf-8', eller brug response.json(), som selv genkender UTF-8.

Blev tekst skrevet med errors='replace' til en kodning uden de nødvendige tegn, indeholder filen ? – så er informationen tabt, se spørgsmålstegn i stedet for bogstaver.

Ofte stillede spørgsmål

Findes der et Python-bibliotek til det her?

Ja, ftfy retter mojibake i Python-kode. Til enkelte filer uden programmering er Mojibuster hurtigere og viser hver ændring, før du gemmer.

Hvilke encoding-værdier har jeg mest brug for?

utf-8, utf-8-sig (UTF-8 med BOM), cp1252 (Windows, vesteuropæisk), latin-1 og utf-16. Store/små bogstaver og bindestreger er ligegyldige.

Bevares skilletegn og tal?

Ja. Mojibuster ændrer kun ødelagte tegn. Kommaer, anførselstegn og linjeskift forbliver præcis, som de er.

Læs mere