Conversion par lots de fichiers csv en xls sur un Mac


0

Je voudrais convertir tous les fichiers csv d'un répertoire en fichiers xls. Nick T a posté ce code ici Comment convertir par lots .csv en .xls / xlsx

import os
import glob
import csv
import xlwt # from http://www.python-excel.org/

for csvfile in glob.glob(os.path.join('.', '*.csv')):
    wb = xlwt.Workbook()
    ws = wb.add_sheet('data')
    with open(csvfile, 'rU') as f:
        reader = csv.reader(f)
        for r, row in enumerate(reader):
            for c, val in enumerate(row):
                ws.write(r, c, val)
    wb.save(csvfile + '.xls')

Cependant, lorsque je lance ceci, une erreur vient de la dernière ligne.

UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xef en position 0: l'ordinal n'est pas dans la plage (128)

Quelqu'un sait comment je peux me débarrasser de ça? Je travaille dans Terminal sur un Mac.


Des caractères non-ASCII dans les noms de fichiers? Et quelle version de Python? V2 ou V3?
— xenoid

Aucun nom de fichier n'est composé que de lettres et de chiffres. Python V2
— user1504686

Ensuite, ce sont vos données qui contiennent des caractères non-ASCII. Par défaut, xwlt n’assume que l’ASCII, voir ici pour une solution (si vous avez de la chance, le second pourrait suffire).
— xenoid

Réponses:


0

J'ai mis à jour ce code pour qu'il fonctionne sur python 3.5 en extrayant deux lignes de la boucle ( wb = xlwt.Workbook() et wb.save('output.xls') étaient dans la boucle).

 import os
 import glob
 import csv
 import xlwt
 wb = xlwt.Workbook() # put the xlwt out of the loop 
 for csvfile in glob.glob(os.path.join('.', '*.csv')):
         fpath = csvfile.split("/", 1)
         fname = fpath[1].split(".", 1)
         ws = wb.add_sheet(fname[0])
         with open(csvfile, 'r') as f:
            reader = csv.reader(f)
            for r, row in enumerate(reader):
                for c, col in enumerate(row):
                    ws.write(r, c, col)

 #Save the results once the loop is done
 wb.save('output.xls')

Bienvenue sur Super User, et merci de votre aide pour cette question. Avez-vous une chance d'ajouter quelques phrases pour expliquer ce que vous avez changé et pourquoi (pour le contexte)?
— fixer1234

Je ne sais pas pourquoi "wb = xlwt.Workbook ()" et wb.save ("output.xls") étaient à l'intérieur de la boucle.
— Fouad Djebbar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.