python excel csv xls export-to-csv

python - convertidor xls a csv



excel export-to-csv (10)

Estoy usando win32.client en python para convertir mi archivo .xlsx y .xls en .csv. Cuando ejecuto este código, está dando un error. Mi código es:

def convertXLS2CSV(aFile): ''''''converts a MS Excel file to csv w/ the same name in the same directory'''''' print "------ beginning to convert XLS to CSV ------" try: import win32com.client, os from win32com.client import constants as c excel = win32com.client.Dispatch(''Excel.Application'') fileDir, fileName = os.path.split(aFile) nameOnly = os.path.splitext(fileName) newName = nameOnly[0] + ".csv" outCSV = os.path.join(fileDir, newName) workbook = excel.Workbooks.Open(aFile) workbook.SaveAs(outCSV, c.xlCSVMSDOS) # 24 represents xlCSVMSDOS workbook.Close(False) excel.Quit() del excel print "...Converted " + nameOnly + " to CSV" except: print ">>>>>>> FAILED to convert " + aFile + " to CSV!" convertXLS2CSV("G://hello.xlsx")

No puedo encontrar el error en este código. Por favor ayuda.


@andi Probé tu código, funciona genial, PERO

En mis hojas hay una columna como esta

2013-03-06T04: 00: 00

fecha y hora en la misma celda

Se confunde durante la exportación, es así en el archivo exportado

41275.0416667

otras columnas están bien.

csvkit, por otro lado, está bien con esa columna, pero solo exporta UNA hoja, y mis archivos tienen muchos.


Citando una answer de Scott Ming , que funciona con un libro de trabajo que contiene varias hojas:

Aquí hay una secuencia de comandos python getsheets.py ( mirror ), debe instalar pandas y xlrd antes de usarlo.

Ejecuta esto:

pip3 install pandas xlrd # or `pip install pandas xlrd`

¿Cómo funciona?

$ python3 getsheets.py -h Usage: getsheets.py [OPTIONS] INPUTFILE Convert a Excel file with multiple sheets to several file with one sheet. Examples: getsheets filename getsheets filename -f csv Options: -f, --format [xlsx|csv] Default xlsx. -h, --help Show this message and exit.

Convierte a varios xlsx:

$ python3 getsheets.py goods_temp.xlsx Sheet.xlsx Done! Sheet1.xlsx Done! All Done!

Convierta a varias csv:

$ python3 getsheets.py goods_temp.xlsx -f csv Sheet.csv Done! Sheet1.csv Done! All Done!

getsheets.py :

# -*- coding: utf-8 -*- import click import os import pandas as pd def file_split(file): s = file.split(''.'') name = ''.''.join(s[:-1]) # get directory name return name def getsheets(inputfile, fileformat): name = file_split(inputfile) try: os.makedirs(name) except: pass df1 = pd.ExcelFile(inputfile) for x in df1.sheet_names: print(x + ''.'' + fileformat, ''Done!'') df2 = pd.read_excel(inputfile, sheetname=x) filename = os.path.join(name, x + ''.'' + fileformat) if fileformat == ''csv'': df2.to_csv(filename, index=False) else: df2.to_excel(filename, index=False) print(''/nAll Done!'') CONTEXT_SETTINGS = dict(help_option_names=[''-h'', ''--help'']) @click.command(context_settings=CONTEXT_SETTINGS) @click.argument(''inputfile'') @click.option(''-f'', ''--format'', type=click.Choice([ ''xlsx'', ''csv'']), default=''xlsx'', help=''Default xlsx.'') def cli(inputfile, format): ''''''Convert a Excel file with multiple sheets to several file with one sheet. Examples: /b getsheets filename /b getsheets filename -f csv '''''' if format == ''csv'': getsheets(inputfile, ''csv'') else: getsheets(inputfile, ''xlsx'') cli()


He probado todos los torres, pero fueron demasiado lentos para mí. Si tiene Excel instalado, puede usar el COM.

Inicialmente pensé que sería más lento, ya que cargará todo para la aplicación real de Excel, pero no es para archivos grandes. Tal vez porque el algoritmo para abrir y guardar archivos ejecuta un código compilado muy optimizado, los chicos de Microsoft ganan mucho dinero después de todo.

import sys import os import glob from win32com.client import Dispatch def main(path): excel = Dispatch("Excel.Application") if is_full_path(path): process_file(excel, path) else: files = glob.glob(path) for file_path in files: process_file(excel, file_path) excel.Quit() def process_file(excel, path): fullpath = os.path.abspath(path) full_csv_path = os.path.splitext(fullpath)[0] + ''.csv'' workbook = excel.Workbooks.Open(fullpath) workbook.Worksheets(1).SaveAs(full_csv_path, 6) workbook.Saved = 1 workbook.Close() def is_full_path(path): return path.find(":") > -1 if __name__ == ''__main__'': main(sys.argv[1])

Este es un código muy simple y no buscará errores, imprime ayuda o nada, solo creará un archivo csv para cada archivo que coincida con el patrón que ingresaste en la función para que puedas procesar por lotes muchos archivos solo ejecutando la aplicación Excel una vez.


Podemos usar Pandas lib de Python para conectar el archivo xls al archivo csv A continuación, el código convertirá el archivo xls al archivo csv. importar pandas como pd

Lea el archivo de Excel desde la ruta local:

df = pd.read_excel("C:/Users/IBM_ADMIN/BU GPA Scorecard.xlsx",sheetname=1)

Recortar espacios presentes en columnas:

df.columns = df.columns.str.strip()

Enviar marco de datos al archivo CSV que será un símbolo de tubería delimitado y sin índice:

df.to_csv("C:/Users/IBM_ADMIN/BU GPA Scorecard csv.csv",sep="|",index=False)


Tal vez alguien encuentre útil este fragmento de código listo para usar. Permite crear CSV de todas las hojas de cálculo en el libro de Excel.

# -*- coding: utf-8 -*- import xlrd import csv from os import sys def csv_from_excel(excel_file): workbook = xlrd.open_workbook(excel_file) all_worksheets = workbook.sheet_names() for worksheet_name in all_worksheets: worksheet = workbook.sheet_by_name(worksheet_name) with open(''{}.csv''.format(worksheet_name), ''wb'') as your_csv_file: wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) for rownum in xrange(worksheet.nrows): wr.writerow([unicode(entry).encode("utf-8") for entry in worksheet.row_values(rownum)]) if __name__ == "__main__": csv_from_excel(sys.argv[1])


Usar xlrd es una forma incorrecta de hacerlo, porque pierde los Formatos de fecha en Excel.

Mi caso de uso es el siguiente.

Tome un archivo de Excel con más de una hoja y conviértalo en un archivo propio.

Lo he hecho usando la biblioteca xlsx2csv y llamando a esto usando un subproceso.

import csv import sys, os, json, re, time import subprocess def csv_from_excel(fname): subprocess.Popen(["xlsx2csv " + fname + " --all -d ''|'' -i -p " "''<New Sheet>'' > " + ''test.csv''], shell=True) return lstSheets = csv_from_excel(sys.argv[1]) time.sleep(3) # system needs to wait a second to recognize the file was written with open(''[YOUR PATH]/test.csv'') as f: lines = f.readlines() firstSheet = True for line in lines: if line.startswith(''<New Sheet>''): if firstSheet: sh_2_fname = line.replace(''<New Sheet>'', '''').strip().replace('' - '', ''_'').replace('' '',''_'') print(sh_2_fname) sh2f = open(sh_2_fname+".csv", "w") firstSheet = False else: sh2f.close() sh_2_fname = line.replace(''<New Sheet>'', '''').strip().replace('' - '', ''_'').replace('' '',''_'') print(sh_2_fname) sh2f = open(sh_2_fname+".csv", "w") else: sh2f.write(line) sh2f.close()


Utilizaría xlrd, es más rápido, multiplataforma y funciona directamente con el archivo. Una cosa a tener en cuenta: no funciona en archivos xlsx, por lo que tendría que guardar su archivo de Excel como xls. Editar: a partir de la versión 0.8.0, xlrd lee los archivos XLS y XLSX.

import xlrd import csv def csv_from_excel(): wb = xlrd.open_workbook(''your_workbook.xls'') sh = wb.sheet_by_name(''Sheet1'') your_csv_file = open(''your_csv_file.csv'', ''wb'') wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) for rownum in xrange(sh.nrows): wr.writerow(sh.row_values(rownum)) your_csv_file.close()


Yo usaría pandas . Las partes computacionalmente pesadas se escriben en cython o c-extensions para acelerar el proceso y la sintaxis es muy clara. Por ejemplo, si quiere convertir "Sheet1" del archivo "your_workbook.xls" en el archivo "your_csv.csv", solo debe usar la función de nivel superior read_excel y el método to_csv de la clase DataFrame la siguiente manera:

import pandas as pd data_xls = pd.read_excel(''your_workbook.xls'', ''Sheet1'', index_col=None) data_xls.to_csv(''your_csv.csv'', encoding=''utf-8'')

Establecer la encoding=''utf-8'' alivia el UnicodeEncodeError mencionado en otras respuestas.


xlsx2csv es más rápido que pandas y xlrd.

xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase

El archivo de Excel por lo general viene con n nombre de hoja.

-s is sheetname index.

luego, se creará la carpeta cruchbase, cada hoja perteneciente a xlsx se convertirá en una sola csv.

ps csvkit es increíble.


csvkit , que usa xlrd (para xls) y openpyxl (para xlsx) para convertir casi cualquier información tabular a csv.

Una vez instalado, con sus dependencias, se trata de:

python in2csv myfile > myoutput.csv

Se ocupa de todos los problemas de detección de formato, por lo que puede pasarlo prácticamente a cualquier fuente de datos tabulares. También es multiplataforma (sin dependencia win32).