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.

40
demandé sur Andrzej Kostański 2012-03-27 10:25:09

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()
59
répondu Ben Hughes 2013-08-16 22:42:45

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

32
répondu philE 2015-05-20 21:32:12

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.

enter image description here

# -*- 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])
28
répondu Andrzej Kostański 2017-07-12 04:08:08

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

19
répondu wombat 2014-09-08 17:27:04

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

3
répondu user1632812 2015-01-20 19:00:49

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.

3
répondu CodeFarmer 2016-11-02 05:50:46

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()
1
répondu Franck Dernoncourt 2018-01-25 03:27:19

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()
0
répondu Ryan Dewar 2016-11-13 19:45:32

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.

0
répondu caiohamamura 2017-02-07 11:56:44

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)
0
répondu Rohit 2018-02-12 09:32:50