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?
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 .
À 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...
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
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.
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.
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.
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
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
Pour les fichiers Excel plus anciens, il existe le module OleFileIO_PL qui peut lire le format de stockage structuré OLE utilisé.