Problem med å, ä och ö
Hej!
När jag försöker exportera en dataframe som har variabler som innehåller svenska specialtecken såsom å, ä och ö ser det konstigt ut när jag sedan öppnar upp csv-filen.
Hur kommer man runt detta? Jag har letat en del på nätet, men inte fått till det.
Jag använder följande kommando för att exportera till csv-fil (df är min dataframe):
df.dropna().to_csv(loc_file,index=False)
Jag brukar kunna lösa sånt, men jag känner inte till dataframe-modulen. Har du ett fullständigt litet program?
Vilken version av Python? 2 eller 3?
Hm, är det hur du sparar den, eller hur du öppnar den efter att du sparat den? Dvs, är det pandas som strular till det, eller är det programmet du använder för att läsa filen?
to_csv() har ett 'encoding'-argument som bestämmer vilken encoding som används när filen sparas. Default är utf-8. Så länge du ser till att också läsa in filen som utf-8 borde det inte vara nåt problem. Om du ser problem i filen när du öppnar den i en texteditor betyder det inte att det blir problem om du läser in den i kod med rätt encoding. Vet iofs inte vad du vill göra med filen.
Hej!
Tack för alla svar. Jag kör Python 3.6. Har skrivit om programmet nu så det bara innehåller de centrala delarna. Grunden är att jag har en excelfil som ser ut enligt nedan:
Jag läser in denna och gör några enkla manipulationer, se koden nedan:
import pandas as pd
from datetime import datetime
run_date = datetime.strptime('20230812', '%Y%m%d')
loc_data = r'C:\Temp\Data.xlsx'
data=pd.read_excel(loc_data)
N = data.shape[0]
M = 0
loc_output = r'C:\Temp\output.csv'
output=pd.DataFrame(columns=["Radnr","Namn","Ort","Ålder"])
for i in range(M,N):
birth_date = data.loc[i,"Födelsedatum"]
age = run_date.year - birth_date.year + (run_date.month - birth_date.month) /12.0 + (run_date.day - birth_date.day) / 360.0
output.loc[i,'Radnr']=i
output.loc[i,'Namn']=data.loc[i,'Namn']
output.loc[i,'Ort']=data.loc[i,'Ort']
output.loc[i,'Ålder']=age
# Write the data frames to CSV files
output.dropna().to_csv(loc_output,index=False)
I outputen (csv-fil) så blir det dock konstiga tecken istället för å, ä och ö (se nedan):
Tillägg: datat output ser bra ut i Python (se nedan). Det är när man skriver till en csv-fil som något går snett.
Tillägg2: jag öppnar csv-filen efteråt (output) i excel.
Och om du skriver till fil, och direkt läser in den igen i en ny dataframe (utan att ha öppnat den i typ excel) ser det konstigt ut då i python? Jag misstänker också att det är något med encoding som gör att det ser konstigt ut i excel
Hej Hondel!
Bra poäng, när jag läste in csv-filen igen i Python (i data2) så såg den bra ut:
data2=pd.read_csv(loc_output)
Det är alltså något i excel som strular när man försöker öppna filen där.
Har inte haft samma problem när jag öppnat csv-filer med å, ä och ö som skapats av R. Men Python kanske fungerar annorlunda?
Det ska finnas någon workaround för problemet med excel genom att man lägger till några tecken i början av filen (BOM). Kan någon möjligen förklara hur jag skulle kunna få in det i mitt program, jag förstår inte riktigt?
https://stackoverflow.com/questions/5202648/adding-bom-unicode-signature-while-saving-file-in-python
Jag står kvar vid att det är encoding som är fel. Kolla upp hur man öppnar en csv-fil i excel med utf-8, eller prova en annan encoding när du sparar till fil (som argument i to_csv alltså).
Detta kanske kan vara till hjälp: https://hilton.org.uk/blog/csv-excel
Hondel skrev:Jag står kvar vid att det är encoding som är fel. Kolla upp hur man öppnar en csv-fil i excel med utf-8, eller prova en annan encoding när du sparar till fil (som argument i to_csv alltså).
Detta kanske kan vara till hjälp: https://hilton.org.uk/blog/csv-excel
Tack för tipset, jag kollar på länken! 🙏
Med följande kod så fungerade det att öppna filen direkt i excel:
output.dropna().to_csv(loc_output,index=False,encoding='utf-8-sig')