Conversión por lotes de archivos csv a xls en una Mac

0

Me gustaría convertir todos los archivos csv en un directorio a archivos xls. Nick T publicó este código aquí Cómo convertir por lotes .csv a .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')

Sin embargo, cuando ejecuto esto, aparece un error proveniente de la última línea.

UnicodeDecodeError: el códec 'ascii' no puede decodificar el byte 0xef en la posición 0: el ordinal no está en el rango (128)

Alguien sabe cómo puedo deshacerme de esto? Estoy trabajando en Terminal en una Mac.

usuario1504686
fuente
¿Algún carácter no ASCII en los nombres de archivo? ¿Y qué versión de Python? V2 o V3?
xenoid
Ningún nombre de archivo es solo letras y números. Python V2
user1504686
Luego, son sus datos los que contienen caracteres que no son ASCII. Por defecto, xwlt solo asume ASCII, vea aquí una solución (si tiene suerte, el segundo podría ser suficiente).
xenoid

Respuestas:

0

Actualicé este código para que funcione en Python 3.5 al obtener dos líneas del bucle ( wb = xlwt.Workbook()y wb.save('output.xls')estaban dentro del bucle).

 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
fuente
Bienvenido a Super User, y gracias por ayudarnos con esta pregunta. ¿Hay alguna posibilidad de que pueda agregar un par de oraciones para explicar lo que cambió y por qué (para el contexto)?
Fixer1234
No sé por qué "wb = xlwt.Workbook ()" y wb.save ('output.xls') estaban dentro del ciclo.
Fouad Djebbar