2015-12-27 20 views
5

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:

  1. Korzystanie xlsxwriter silnik wyraźnie. To chyba nic nie zmienia.
  2. 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 
    
  3. Zmiana ręcznie wszystkich znaków ofensywnych na inne. Wciąż brak efektu (cytowany błąd uzyskano po tej zmianie).

  4. 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') 
+0

Wypróbowałeś już 'df.to_excel (path, encoding = 'utf8')'? – Stefan

+0

@Stefan mam, dzięki za pytanie. Oczywiście, spróbowałem tego jeszcze raz - właśnie teraz. Wciąż nic. – jjj

Odpowiedz

3

Podobno był to błąd w wersji pandas, którego używałem wtedy. Teraz, w pandas wer. 0.19.2, poniższy kod zapisuje plik csv z pytania bez żadnych problemów (i z poprawnym kodowaniem).
UWAGA: Moduł openpyxl musi być zainstalowany w systemie.

import pandas as pd 
df = pd.read_csv('Desktop/test.csv') 
df.to_excel('Desktop/test.xlsx', encoding='utf8') 
+0

To nie działa dla mnie z pandami 0.20.3 –

+0

@greghor hmm, dziwne. Zainstalowałem tę samą wersję właśnie teraz i działa to dla mnie. Czy masz zainstalowane 'openpyxl'? – jjj

+0

dzięki za odpowiedź, mam zainstalowany openpyxl 2-5-0. Po chwili szamotania zauważyłem, że jeśli określę kodowanie podczas ładowania danych 'df = pd.read_csv (" test.csv ", encoding =" utf-8 ")', to działa dobrze. –

0

Co jeśli zapisać csv pliki z pand, a następnie użyć win32com do konwersji do Excela. Byłoby to wyglądać mniej więcej tak ...

import win32com.client 
excel = win32com.client.Dispatch("Excel.Application") 
excel.Visible = 0 

for x in range(10): 
    f = path + str(x) 
    # not showing the pandas dataframe creation 
    df.to_csv(f+'.csv') 
    wb = excel.Workbooks.Open(f+'.csv') 
    wb.SaveAs(f+'.xlsx', 51) #xlOpenXMLWorkbook=51 
2

Spróbuj kodowania kolumny ze znaków spoza ASCII jako

df['col'] = df['col'].apply(lambda x: unicode(x)) 

a następnie zapisać plik do formatu xlsx z kodowania „utf8”

+0

Dzięki za sugestię, niestety to nie działa.Ten sam błąd jest zwracany, ale teraz jest on wyzwalany przez linię '.apply'. – jjj

+0

Czy możesz załączyć fragment pliku csv tutaj? –

+0

Przepraszamy za spóźnioną odpowiedź. Część mojego pliku, która powinna wystarczyć do wywołania błędu, została umieszczona w moim pytaniu. Chcesz czegoś więcej? – jjj