web-dev-qa-db-fra.com

Les pandas Python to_Excel ne peuvent pas décoder octet

J'essaie de travailler sur des données dans des pandas Python et j'ai du mal à écrire mes résultats ..__ J'ai lu mes données dans un fichier CSV et j'ai exporté chaque script en tant que fichier CSV propre qui fonctionne bien. Dernièrement bien que j'ai essayé d'exporter tout dans 1 fichier Excel avec des feuilles de calcul et quelques feuilles me donnent une erreur 

"Le codec 'utf8' ne peut pas décoder l'octet 0xe9 en position 1: octet de continuation non valide"

Je ne sais même pas comment commencer à rechercher des caractères susceptibles de poser des problèmes d’exportation vers Excel. Je ne sais pas pourquoi il exporte au format CSV: ((

lignes pertinentes

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()

tête d'impression de la trame de données incriminée

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

en regardant la feuille Excel, je reçois une impression partielle. Tout ce qui se trouve dans la colonne du prénom et au-delà est vide, mais l'événement, le constituant et l'adresse électronique sont tous imprimés. 

edit: Essayer de lire le csv en tant que utf8 échoue, mais de le lire en tant que latin1 fonctionne. Est-il possible de spécifier le codage to_Excel? Ou décoder et encoder mon dataframe en utf8? 

18
Wizuriel

Géré pour résoudre ceci.

J'ai créé une fonction qui parcourt mes colonnes avec des chaînes et je suis parvenue à les décoder/encoder en utf8 et cela fonctionne maintenant.

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

Dans mon cas, le problème était que je lisais initialement le fichier CSV avec le mauvais codage (ASCII au lieu de cp1252). Par conséquent, lorsque les pandas ont essayé de l'écrire dans un fichier Excel, il a trouvé des caractères qu'il ne pouvait pas décoder.

Je l'ai résolu en spécifiant le codage correct lors de la lecture du fichier CSV.

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

En fait, il existe un moyen de forcer le codage utf8 en transmettant un paramètre à 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()
5
user3570953

Le plus simple est de charger votre dataframe dans utf-8. Ensuite, ExcelWriter ne l’enregistrera pas. 

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

je ne sais pas quand ça va être publié, mais vous pouvez essayer avec mon dépôt github:

https://github.com/jtornero/pandas

Vous pouvez le cloner et construire des pandas à partir de la source; le problème est presque résolu et cela fonctionne comme

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()

À votre santé

Jorge Tornero

1
Jorge Tornero

Semblable à ce que disait @Zenadix, lire les csv au format UTF-8 permettait à ExcelWriter d’écrire sans erreur.

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

...

with pd.ExcelWriter('new_path') as writer:
    df.to_Excel(writer, sheet_name='Foo')


0
Joe Banks