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