web-dev-qa-db-fra.com

convertisseur xls en csv

J'utilise win32.client en python pour convertir mon fichier .xlsx et .xls en un fichier .csv. Quand j'exécute ce code, cela 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.

43
Lalit Chattar

Je voudrais utiliser xlrd - c'est plus rapide, multi-plateforme et fonctionne directement avec le fichier. Une chose à noter - cela ne fonctionne pas sur les fichiers xlsx - vous devez donc enregistrer votre fichier Excel au format xls. Éditer: Depuis 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()
62
Ben Hughes

Je voudrais utiliser pandas. Les parties lourdes en calcul sont écrites en cython ou en c-extensions pour accélérer le processus et la syntaxe est très claire. Par exemple, si vous souhaitez convertir "Sheet1" du fichier "your_workbook.xls" dans le fichier "your_csv.csv", utilisez simplement la fonction de niveau supérieur read_Excel et la méthode to_csv de la classe DataFrame 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')

Le réglage de encoding='utf-8' atténue la UnicodeEncodeError mentionnée dans d'autres réponses.

36
philE

Peut-être que quelqu'un trouvera ce morceau de code prêt à l'emploi utile. Il permet de créer des fichiers CSV à partir de toutes les feuilles de calcul 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 __== "__main__":
    csv_from_Excel(sys.argv[1])
29
andilabs

J'utiliserais csvkit , qui utilise xlrd (pour xls) et openpyxl (pour xlsx) pour convertir à peu près toutes les données tabulaires en csv.

Une fois installé, avec ses dépendances, il s’agit de:

python in2csv myfile > myoutput.csv

Il prend en charge tous les problèmes de détection de format, vous pouvez donc le transmettre à peu près à n'importe quelle source de données tabulaire. Il est également multi-plateforme (pas de dépendance win32).

20
wombat

xlsx2csv est plus rapide que les pandas et xlrd.

xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase

Le fichier Excel est généralement livré avec n nom-feuille.

-s is sheetname index.

ensuite, le dossier cruchbase sera créé, chaque feuille appartenant à xlsx sera convertie en un seul fichier csv.

p.s. csvkit est génial aussi.

3
CodeFarmer

@andi j'ai testé votre code, cela fonctionne très bien, MAIS

Dans mes feuilles il y a une colonne comme celle-ci

2013-03-06T04: 00: 00

date et heure dans la même cellule

Cela se brouille lors de l'exportation, c'est comme ça dans le fichier exporté

41275.0416667

les autres colonnes sont ok.

csvkit, de l’autre côté, accepte cette colonne, mais n’exporte qu’UNE SEULE feuille, et mes fichiers en ont beaucoup.

3
user1632812

Citant un answer from Scott Ming , qui fonctionne avec un classeur contenant plusieurs feuilles:

Voici un script python getsheets.py ( mirror ), vous devez installer pandas et xlrd avant de l’utiliser.

Lance ça:

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 en plusieurs xlsx:

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

All Done!

Convertir en 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
Franck Dernoncourt

Utiliser xlrd est une façon imparfaite de procéder car vous perdez les formats de date dans Excel.

Mon cas d'utilisation est le suivant.

Prenez un fichier Excel avec plusieurs feuilles et convertissez-les chacune en un fichier distinct.

J'ai fait cela en utilisant la bibliothèque xlsx2csv et en appelant cela à l'aide d'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
Ryan Dewar

Nous pouvons utiliser Pandas lib de Python pour convertir un fichier xls en fichier csv Le code ci-dessous convertira le fichier xls en fichier csv . Importer des pandas en tant que pd

Lire le fichier Excel à partir du chemin local:

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

Couper les espaces présents sur les colonnes:

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

Envoyez le cadre de données au fichier CSV qui sera délimité par un symbole de canal et sans index:

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

J'ai testé toutes les réponses, mais elles étaient toutes trop lentes pour moi. Si vous avez installé Excel, vous pouvez utiliser le COM. 

Je pensais au départ que ce serait plus lent, car tout le contenu de l'application Excel réelle serait chargé, mais ce n'est pas le cas pour les fichiers volumineux. Peut-être parce que l'algorithme d'ouverture et de sauvegarde des fichiers utilise un code compilé fortement optimisé, les gars de Microsoft gagnent beaucoup d'argent 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 __== '__main__':
    main(sys.argv[1])

Il s'agit d'un code très brut qui ne vérifie pas les erreurs, l'aide à l'impression ou quoi que ce soit. Il crée simplement un fichier csv pour chaque fichier correspondant au modèle que vous avez entré dans la fonction afin que vous puissiez traiter par lots beaucoup de fichiers uniquement en lançant l'application Excel une fois que.

0
caiohamamura