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.

user1504686
la source
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')
Fouad Djebbar
la source
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