2013-09-05 6 views
16

Sto provando a fare un po 'di lavoro sui dati nei panda Python e ho problemi a scrivere i miei risultati. Ho letto i miei dati come file CSV e ho esportato ogni script come se fosse un file CSV che funziona correttamente. Ultimamente però ho provato esportare tutto in 1 file di Excel con i fogli di lavoro e alcuni dei fogli mi danno un erroreIl codec di Python to_excel 'utf8' non può decodificare il byte

"codec 'utf8' non può decodificare byte 0xE9 in posizione 1: valide byte di continuazione"

Non ho idea di come iniziare a trovare alcun carattere che potrebbe causare problemi nell'esportazione in Excel. Non certo perché si esporta in formato CSV appena soddisfacente, anche se :(

linee rilevanti

from pandas import ExcelWriter 
data = pd.read_csv(input) 
writer = ExcelWriter(output) #output is just the filename 
fundraisers.to_excel(writer, "fundraisers") 
locations.to_excel(writer, "locations") #error 
locations.to_csv(outputcsv) #works 
writer.save() 

stampa testa di offendere dataframe

Event ID Constituent ID Email Address First Name \ Last Name 
f  1  A  A  1 
F  4  L  R  C 
M  1  1  A  D 
F  4  A  A  G 
M  2  0  R  G 
M  3  O  O  H 
M  2  T  E  H 
M  2  A  A  H 
M  2  M  M  K 
F  3  J  E  K 
Location ID raised raised con raised email 
a 0 0 0 
a 8 0 0 
o 0 0 0 
o 0 0 0 
o 0 0 0 
t 5 0 0 
o 1 0 0 
o 6 a 0 
o 6 0 0 
d 0 0 0 

guardare il foglio excel io effettivamente ottenere un'impronta parziale fuori Qualsiasi cosa nella colonna nome e oltre sono vuoti, ma tutti gli eventi, costituenti ed e-mail sono tutti stampati

modifica: tentativo di leggere il csv in come utf8 non riesce, ma la lettura in quanto latin1 funziona. C'è un modo per specificare la codifica to_excel? O decodificare e codificare il mio dataframe in utf8?

+0

Puoi pubblicare alcuni dei tuoi caratteri unicode potenzialmente offensivi? Generare caratteri ebraici casuali e poi scriverli funziona bene per me. –

+2

Non ho idea di come trovare il personaggio che trova offensivo. – Wizuriel

+0

Uno dei motivi per cui CSV è diverso è che l'esportazione in Excel non viene eseguita da 'pandas', ma da librerie di terze parti (' xlwt' e/o 'openpyxl'). –

risposta

17

Gestito per risolvere questo.

Ho creato una funzione che attraversa le mie colonne che hanno stringhe e sono riuscito a decodificarle/codificarle in utf8 e ora funziona.

def changeencode(data, cols): 
    for col in cols: 
     data[col] = data[col].str.decode('iso-8859-1').str.encode('utf-8') 
    return data 
+7

Grazie! Questa funzione è stata abbastanza utile. Sarebbe utile per Pandas avere questo tipo di funzionalità integrata, invece di lanciare un errore meno che perspicace (o almeno identificare la prima riga e la colonna in cui ha riscontrato il problema). – murphsp1

1

non si sa quando sta per essere rilasciato, ma si può provare con il mio repository GitHub:

https://github.com/jtornero/pandas

È possibile clonare e costruire panda dalla sorgente; il problema è quasi risolto e funziona come

sampleList = ['Miño', '1', '2', 'señora'] 
dataframe = pandas.DataFrame(sampleList) 
ew = pandas.ExcelWriter('./test.xls', encoding='utf-8') 
dataframe.to_excel(ew) 
ew.save() 

Acclamazioni

Jorge Tornero

4

realtà, c'è un modo per forzare la codifica utf8 passando un parametro per ExcelWriter:

ew = pandas.ExcelWriter('test.xlsx',options={'encoding':'utf-8'}) 
sampleList = ['Miño', '1', '2', 'señora'] 
dataframe = pandas.DataFrame(sampleList) 
dataframe.to_excel(ew) 
ew.save() 
+0

In '.to_csv' prende anche un parametro' encoding' opzionale. – notconfusing

11

Nel mio caso, il problema era che inizialmente ero leggendo il file CSV con la codifica errata (ASCII invece di cp1252). Pertanto, quando i panda hanno provato a scriverlo in un file Excel, ha trovato alcuni caratteri che non è stato in grado di decodificare.

Ho risolto il problema specificando la codifica corretta durante la lettura del file CSV.

data = pd.read_csv(fname, encoding='cp1252') 
2

La cosa più semplice è caricare il tuo dataframe in utf-8. Quindi ExcelWriter lo salverà senza problemi.

data = pd.read_csv(path,encoding='utf-8') 
-1

ho continuato a ottenere lo stesso errore e fuori tutti i suggerimenti l'unica cosa che ha funzionato per me è stato:

data = pd.read_csv('Filename.csv', encoding='cp1252') 

Grazie mille!

+0

Questa risposta è stata precedentemente dichiarata e la tua aggiunta o modifica nulla da quella dichiarazione iniziale. In futuro, basta votare la risposta che ha funzionato per te. –

+0

Non sono ancora in grado di votare, ma ho apprezzato chi ha l'unica risposta che ha funzionato per me quindi ho sentito il bisogno di fare qualcosa come confermare la loro risposta. Una volta che avrò abbastanza ripetizioni, farò l'upvot. – Dpsmurphy