web-dev-qa-db-fra.com

Lecture/analyse de fichiers Excel (xls) avec Python

Quel est le meilleur moyen de lire des fichiers Excel (XLS) avec Python (pas CSV fichiers).

Existe-t-il un package intégré pris en charge par défaut en Python pour effectuer cette tâche?

93
qrbaQ

Je recommande fortement xlrd pour lire les fichiers .xls.

le voyageur a mentionné l’utilisation de l’automatisation COM. Ayant moi-même fait cela il y a quelques années, sachez que c'est un vrai PITA. Le nombre de mises en garde est énorme et la documentation manque et est agaçante. J'ai rencontré de nombreux bugs et bugs étranges, dont certains ont pris de nombreuses heures à résoudre.

UPDATE: Pour les fichiers .xlsx plus récents, la bibliothèque recommandée pour la lecture et l'écriture semble être openpyxl .

80
taleinat

À l'aide de pandas:

import pandas as pd

xls = pd.ExcelFile("yourfilename.xls")

sheetX = xls.parse(2) #2 is the sheet number

var1 = sheetX['ColumnName']

print(var1[1]) #1 is the row number...
28
GPB83

la bibliothèque python xlrd peut être une meilleure solution à ce problème 

import xlrd

ouvrir un classeur 

workbook = xlrd.open_workbook('your_file_name.xlsx')

feuille ouverte par nom

worksheet = workbook.sheet_by_name('Name of the Sheet')

feuille ouverte par index

worksheet = workbook.sheet_by_index(0)

lire la valeur de la cellule 

worksheet.cell(0, 0).value    
15
somil

Je pense que les Pandas sont la meilleure voie à suivre. Il y a déjà une réponse ici avec les Pandas utilisant la fonction ExcelFile, mais cela ne fonctionnait pas correctement pour moi. De ici j'ai trouvé la fonction read_Excel qui fonctionne très bien:

import pandas as pd
dfs = pd.read_Excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))

P.S. La xlrd doit être installée pour que la fonction read_Excel puisse fonctionner.

2
Foad

Vous pouvez utiliser n’importe laquelle des bibliothèques listées ici (comme Pyxlreader basée sur JExcelApi, ou xlwt ), plus l’automatisation COM pour utiliser Excel lui-même pour la lecture fichiers, mais pour cela, vous introduisez Office en tant que dépendance de votre logiciel, ce qui pourrait ne pas toujours être une option.

1
Esteban Küber

Vous pourriez également envisager d'exécuter le programme (non-python) xls2csv. Nourrissez-le d'un fichier xls, et vous devriez récupérer un csv.

1
moi

Python Excelerator s’occupe également de cette tâche. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/

Il est également disponible dans Debian et Ubuntu:

 Sudo apt-get install python-excelerator
0
Jamieson Becker

Pour xlsx, j'aime bien la solution précédemment affichée sous le nom https://stackoverflow.com/questions/4371163/reading-xlsx-files-using-python . J'utilise des modules de la bibliothèque standard uniquement.

def xlsx(fname):
    import zipfile
    from xml.etree.ElementTree import iterparse
    z = zipfile.ZipFile(fname)
    strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
    rows = []
    row = {}
    value = ''
    for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')):
        if el.tag.endswith('}v'):                                
            value = el.text
        if el.tag.endswith('}c'):                                 
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            letter = el.attrib['r']                             
            while letter[-1].isdigit():
                letter = letter[:-1]
            row[letter] = value
            value = ''
        if el.tag.endswith('}row'):
            rows.append(row)
            row = {}
    return rows

Les améliorations ajoutées consistent à récupérer le contenu par nom de feuille, à utiliser re pour obtenir la colonne et à vérifier si les chaînes partagées sont utilisées.

def xlsx(fname,sheet):
    import zipfile
    from xml.etree.ElementTree import iterparse
    import re
    z = zipfile.ZipFile(fname)
    if 'xl/sharedStrings.xml' in z.namelist():
        # Get shared strings
        strings = [element.text for event, element
                   in iterparse(z.open('xl/sharedStrings.xml')) 
                   if element.tag.endswith('}t')]
    sheetdict = { element.attrib['name']:element.attrib['sheetId'] for event,element in iterparse(z.open('xl/workbook.xml'))
                                      if element.tag.endswith('}sheet') }
    rows = []
    row = {}
    value = ''

    if sheet in sheets:
    sheetfile = 'xl/worksheets/sheet'+sheets[sheet]+'.xml'
    #print(sheet,sheetfile)
    for event, element in iterparse(z.open(sheetfile)):
        # get value or index to shared strings
        if element.tag.endswith('}v') or element.tag.endswith('}t'):
            value = element.text
        # If value is a shared string, use value as an index
        if element.tag.endswith('}c'):
            if element.attrib.get('t') == 's':
                value = strings[int(value)]
            # split the row/col information so that the row leter(s) can be separate
            letter = re.sub('\d','',element.attrib['r'])
            row[letter] = value
            value = ''
        if element.tag.endswith('}row'):
            rows.append(row)
            row = {}

    return rows
0
Hans de Ridder

Pour les fichiers Excel plus anciens, il existe le module OleFileIO_PL qui peut lire le format de stockage structuré OLE utilisé.

0
Gavin Smith