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