@voyager: il veut LIRE les fichiers pas les écrire
John Machin
Réponses:
92
Je recommande vivement xlrd pour la lecture de .xlsfichiers.
voyager a mentionné l'utilisation de l'automatisation COM. Ayant fait cela moi-même il y a quelques années, sachez que faire cela est un vrai PITA. Le nombre de mises en garde est énorme et la documentation fait défaut et ennuyeuse. J'ai rencontré de nombreux bugs et pièges étranges, dont certains ont pris plusieurs heures à résoudre.
MISE À JOUR: Pour les .xlsxfichiers plus récents , la bibliothèque recommandée pour la lecture et l'écriture semble être openpyxl (merci, Ikar Pohorský).
Pour les fichiers Excel 2007+ ( .xlsx), vous utiliserez probablement OpenPyXL .
Ikar Pohorský
48
Utilisation 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 "lecture de la valeur de la cellule" ne fonctionne pas ... elle déclenche une TypeError: l'objet 'Sheet' n'est pas appelable. Tout le reste a très bien fonctionné.
Newbielp le
13
Je pense que Pandas est la meilleure voie à suivre. Il y a déjà une réponse ici avec Pandas utilisant la ExcelFilefonction, mais cela n'a pas fonctionné correctement pour moi. De là, j'ai trouvé la read_excelfonction 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))
PS Vous devez avoir xlrdinstallé pour que la read_excelfonction fonctionne
Mise à jour 21-03-2020: Comme vous pouvez le voir ici , il y a des problèmes avec le xlrdmoteur et il va être obsolète. C'est openpyxlle meilleur remplacement. Ainsi, comme décrit ici , la syntaxe canonique devrait être:
def xlsx(fname):import zipfile
from xml.etree.ElementTreeimport 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'):# Example: <v>84</v>
value = el.text
if el.tag.endswith('}c'):# Example: <c r="A3" t="s"><v>84</v></c> if el.attrib.get('t')=='s':
value = strings[int(value)]
letter = el.attrib['r']# Example: AZ22 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.ElementTreeimport 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 stringsif element.tag.endswith('}v')or element.tag.endswith('}t'):
value = element.text
# If value is a shared string, use value as an indexif 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
Vous pouvez utiliser l'une des bibliothèques répertoriées ici (comme Pyxlreader basé sur JExcelApi ou xlwt ), ainsi que l' automatisation COM pour utiliser Excel lui-même pour la lecture des fichiers, mais pour cela, vous introduisez Office en tant que dépendance de votre logiciel, ce qui n'est peut-être pas toujours une option.
(1) pyxlreader est la vérole absolue. Vous ne devez jamais l'avoir essayé. Voir mes commentaires ici: stackoverflow.com/questions/1243545/… (2) xlwtfichiers WriTes; utiliser xlrdpour les fichiers ReaD.
John Machin
2
Si vous avez besoin d'un ancien format XLS. Ci-dessous le code pour ansii 'cp1251'.
import xlrd
file=u'C:/Landau/task/6200.xlsx'try:
book = xlrd.open_workbook(file,encoding_override="cp1251")except:
book = xlrd.open_workbook(file)print("The number of worksheets is {0}".format(book.nsheets))print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))for rx in range(sh.nrows):print(sh.row(rx))
with open(csv_filename)as file:
data = file.read()with open(xl_file_name,'w')as file:
file.write(data)
Vous pouvez activer CSV pour exceller comme ci-dessus avec des packages intégrés. CSV peut être géré avec un package intégré de dictreader et dictwriter qui fonctionnera de la même manière que le dictionnaire python. ce qui le rend beaucoup plus facile. Je ne connais actuellement aucun package intégré pour Excel, mais j'avais rencontré openpyxl. C'était aussi assez simple et direct.Vous pouvez voir l'extrait de code ci-dessous en espérant que cela aide
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']print(result.value)
Pour les .xlsfichiers plus anciens , vous pouvez utiliserxlrd
soit vous pouvez l'utiliser xlrddirectement en l'important. Comme ci-dessous
import xlrd
wb = xlrd.open_workbook(file_name)
Ou vous pouvez également utiliser la pd.read_excel()méthode pandas , mais n'oubliez pas de spécifier le moteur, bien que la valeur par défaut soit xlrd, il doit être spécifié.
pd.read_excel(file_name, engine = xlrd)
Les deux fonctionnent pour les anciens .xlsformats de fichiers. En fait, je suis tombé sur cela lorsque j'ai utilisé OpenPyXL, j'ai l'erreur ci-dessous
InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file,or convert it to the more recent .xlsx file format.
Réponses:
Je recommande vivement xlrd pour la lecture de
.xls
fichiers.voyager a mentionné l'utilisation de l'automatisation COM. Ayant fait cela moi-même il y a quelques années, sachez que faire cela est un vrai PITA. Le nombre de mises en garde est énorme et la documentation fait défaut et ennuyeuse. J'ai rencontré de nombreux bugs et pièges étranges, dont certains ont pris plusieurs heures à résoudre.
MISE À JOUR: Pour les
.xlsx
fichiers plus récents , la bibliothèque recommandée pour la lecture et l'écriture semble être openpyxl (merci, Ikar Pohorský).la source
.xlsx
), vous utiliserez probablement OpenPyXL .Utilisation de pandas:
la source
Vous pouvez choisir l'un d'entre eux http://www.python-excel.org/
Je recommanderais la bibliothèque python xlrd.
installez-le en utilisant
importer en utilisant
pour ouvrir un classeur
ouvrir la feuille par nom
ouvrir la feuille par index
lire la valeur de la cellule
la source
Je pense que Pandas est la meilleure voie à suivre. Il y a déjà une réponse ici avec Pandas utilisant la
ExcelFile
fonction, mais cela n'a pas fonctionné correctement pour moi. De là, j'ai trouvé laread_excel
fonction qui fonctionne très bien:PS Vous devez avoir
xlrd
installé pour que laread_excel
fonction fonctionneMise à jour 21-03-2020: Comme vous pouvez le voir ici , il y a des problèmes avec le
xlrd
moteur et il va être obsolète. C'estopenpyxl
le meilleur remplacement. Ainsi, comme décrit ici , la syntaxe canonique devrait être:la source
Pour xlsx, j'aime la solution publiée plus tôt sous https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python . J'utilise uniquement des modules de la bibliothèque standard.
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.
la source
Vous pouvez utiliser l'une des bibliothèques répertoriées ici (comme Pyxlreader basé sur JExcelApi ou xlwt ), ainsi que l' automatisation COM pour utiliser Excel lui-même pour la lecture des fichiers, mais pour cela, vous introduisez Office en tant que dépendance de votre logiciel, ce qui n'est peut-être pas toujours une option.
la source
xlwt
fichiers WriTes; utiliserxlrd
pour les fichiers ReaD.Si vous avez besoin d'un ancien format XLS. Ci-dessous le code pour ansii 'cp1251'.
la source
Python Excelerator gère également cette tâche. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
Il est également disponible dans Debian et Ubuntu:
la source
Vous pouvez également envisager d'exécuter le programme (non-python) xls2csv. Donnez-lui un fichier xls et vous devriez récupérer un csv.
la source
xls2csv
, puis d'analyser lecsv
depuis Python?Pour les anciens fichiers Excel, il existe le module OleFileIO_PL qui peut lire le format de stockage structuré OLE utilisé.
la source
Vous pouvez activer CSV pour exceller comme ci-dessus avec des packages intégrés. CSV peut être géré avec un package intégré de dictreader et dictwriter qui fonctionnera de la même manière que le dictionnaire python. ce qui le rend beaucoup plus facile. Je ne connais actuellement aucun package intégré pour Excel, mais j'avais rencontré openpyxl. C'était aussi assez simple et direct.Vous pouvez voir l'extrait de code ci-dessous en espérant que cela aide
la source
Pour les
.xls
fichiers plus anciens , vous pouvez utiliserxlrd
soit vous pouvez l'utiliser
xlrd
directement en l'important. Comme ci-dessousOu vous pouvez également utiliser la
pd.read_excel()
méthode pandas , mais n'oubliez pas de spécifier le moteur, bien que la valeur par défaut soitxlrd
, il doit être spécifié.Les deux fonctionnent pour les anciens
.xls
formats de fichiers. En fait, je suis tombé sur cela lorsque j'ai utiliséOpenPyXL
, j'ai l'erreur ci-dessousla source