Mam podobny problem do wspomnianego here, ale żadna z sugerowanych metod nie działa dla mnie.Pandy: zapisz się, by rozwiązać problem kodowania
Mam plik .csv o średniej wielkości utf-8
z dużą ilością znaków spoza zestawu ASCII. Dzielę plik według określonej wartości z jednej z kolumn, a następnie chcę zapisać każdą z uzyskanych ramek danych jako plik .xlsx z zachowanymi znakami.
ten nie działa, a ja dostaję błąd:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 7: ordinal not in range(128)
Oto, co starałem:
- Korzystanie
xlsxwriter
silnik wyraźnie. To chyba nic nie zmienia. Definiowanie funkcji (poniżej) w celu zmiany kodowania i odrzucania złych znaków. To również niczego nie zmienia.
def changeencode(data): cols = data.columns for col in cols: if data[col].dtype == 'O': data[col] = data[col].str.decode('utf-8').str.encode('ascii', 'ignore') return data
Zmiana ręcznie wszystkich znaków ofensywnych na inne. Wciąż brak efektu (cytowany błąd uzyskano po tej zmianie).
Kodowanie pliku jako
utf-16
(co, jak sądzę, jest poprawnym kodowaniem, ponieważ chcę później móc manipulować plikiem z poziomu programu Excel) również nie pomaga.
Uważam, że problem tkwi w samym pliku (z powodu 2 i 3), ale nie mam pojęcia, jak go obejść. Byłbym wdzięczny za każdą pomoc. Początek pliku jest wklejony poniżej.
"Submitted","your-name","youremail","phone","miasto","cityCF","innemiasto","languagesCF","morelanguages","wiek","partnerCF","messageCF","acceptance-795","Submitted Login","Submitted From","2015-12-25 14:07:58 +00:00","Zózia kryś","[email protected]","4444444","Wrocław","","testujemy polskie znaki","Polski","testujemy polskie znaki","44","test","test","1","Justyna","99.111.155.132",
EDIT
Niektóre kodu (jedna z wersji, bez części rozbitego):
import pandas as pd
import string
import xlsxwriter
df = pd.read_csv('path-to-file.csv')
with pd.ExcelWriter ('test.xlsx') as writer:
df.to_excel(writer, sheet_name = 'sheet1',engine='xlsxwriter')
Wypróbowałeś już 'df.to_excel (path, encoding = 'utf8')'? – Stefan
@Stefan mam, dzięki za pytanie. Oczywiście, spróbowałem tego jeszcze raz - właśnie teraz. Wciąż nic. – jjj