convertisseur XLS-csv
j'utilise win32.client en python pour convertir mes .xlsx et .fichier xls en un .csv. Lorsque j'exécute ce code, il donne une erreur. Mon code est:
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")
Je ne suis pas capable de trouver l'erreur dans ce code. S'il vous plaît aider.
10 réponses
j'utiliserais xlrd - c'est plus rapide, cross plate-forme et fonctionne directement avec le fichier. une chose à noter - cela ne fonctionne pas sur les fichiers xlsx - donc vous devez sauvegarder votre fichier Excel sous xls.Edit: à partir de la version 0.8.0, xlrd
lit les fichiers XLS et 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()
je voudrais utiliser pandas
. Les pièces de calcul lourd sont écrits en cython ou c-extensions pour accélérer le processus et la syntaxe est très propre. Par exemple, si vous voulez tourner "Sheet1" à partir du fichier "votre_workbook.xls" dans le fichier "your_csv.csv", vous utilisez juste la fonction de haut niveau read_excel
et la méthode to_csv
DataFrame
classe comme suit:
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')
encoding='utf-8'
allège le UnicodeEncodeError
mentionné dans d'autres réponses.
peut-être que quelqu'un trouvera ce code prêt à l'emploi utile. Il permet de créer CSVs à partir de tous les tableurs du classeur 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])
j'utilise csvkit, qui utilise xlrd (pour xls) et openpyxl (pour xlsx) pour convertir n'importe quelle donnée tabulaire en csv.
une Fois installé, avec ses dépendances, c'est une question de:
python in2csv myfile > myoutput.csv
il prend soin de tous les problèmes de détection de format, de sorte que vous pouvez passer à peu près n'importe quelle source de données tabulaires. C'est aussi multi-plateforme (pas de dépendance win32).
@andi j'ai testé votre code, il fonctionne très bien, mais
Dans mes draps il y a une colonne comme ceci
2013-03-06T04:00: 00
date et l'heure dans la même cellule
cela devient confus pendant l'exportation, c'est comme ça dans le fichier exporté
41275.0416667
les autres colonnes sont ok.
csvkit, de l'autre côté, fait ok avec cette colonne mais exporte seulement une feuille, et mes dossiers ont beaucoup.
xlsx2csv plus vite que pandas et xlrd.
xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase
le fichier excel est généralement livré avec n sheetname.
-s is sheetname index.
ensuite, le dossier cruchbase sera créé, chaque feuille appartenant à xlsx sera convertie en un seul csv.
p.s. csvkit est génial.
Citant un réponse Scott Ming, qui fonctionne avec classeur contenant plusieurs feuilles:
Voici un script python getsheets.py (miroir), vous devez installer pandas
et xlrd
avant de l'utiliser.
Exécuter ceci:
pip3 install pandas xlrd # or `pip install pandas xlrd`
Comment ça fonctionne?
$ 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.
Convertir plusieurs xlsx:
$ python3 getsheets.py goods_temp.xlsx
Sheet.xlsx Done!
Sheet1.xlsx Done!
All Done!
Convertir plusieurs 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()
utiliser xlrd est une façon imparfaite de le faire, parce que vous perdez les Formats de Date dans Excel.
Mon cas d'utilisation est le suivant.
prenez un fichier Excel avec plus d'une feuille et convertissez chacune en un fichier qui lui est propre.
j'ai fait cela en utilisant la bibliothèque xlsx2csv et en l'appelant en utilisant un sous-processus.
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()
j'ai testé tous les anwers, mais ils étaient trop lents pour moi. Si vous avez Excel installé, vous pouvez utiliser le COM.
j'ai pensé au départ qu'il serait plus lent car il chargera tout pour L'application Excel réelle, mais il n'est pas pour les fichiers énormes. Peut-être parce que L'algorithme pour ouvrir et sauver des fichiers exécute un code compilé fortement optimisé, les gars de Microsoft font beaucoup d'argent pour elle après tout.
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])
c'est du code très brut et ne vérifie pas les erreurs, Imprimez l'aide ou n'importe quoi, il va juste créer un fichier csv pour chaque fichier qui correspond au modèle que vous avez entré dans la fonction de sorte que vous pouvez le traitement par lots un grand nombre de fichiers seulement le lancement de l'application excel Une fois.
nous pouvons utiliser Pandas lib de Python pour convertir le fichier xls en fichier csv Ci-dessous le code convertira le fichier xls en fichier csv . importer des pandas en tant que pd
Lire Fichier Excel de Chemin d'accès Local :
df = pd.read_excel("C:/Users/IBM_ADMIN/BU GPA Scorecard.xlsx",sheetname=1)
garnir les espaces présents sur les colonnes:
df.columns = df.columns.str.strip()
envoyer la base de données au fichier CSV qui sera délimité par un symbole pipe et sans Index:
df.to_csv("C:/Users/IBM_ADMIN/BU GPA Scorecard csv.csv",sep="|",index=False)