La nouvelle version de Pandas utilise l'interface suivante pour charger les fichiers Excel:
read_excel('path_to_file.xls', 'Sheet1', index_col=None, na_values=['NA'])
mais que faire si je ne connais pas les feuilles disponibles?
Par exemple, je travaille avec des fichiers Excel que les feuilles suivantes
Données 1, Données 2 ..., Données N, toto, bar
mais je ne sais pas N
a priori.
Existe-t-il un moyen d'obtenir la liste des feuilles à partir d'un document Excel dans Pandas?
ExcelFile
? Aussi, disons que je recherche la liste des feuilles et décide d'en charger N, devrais-je à ce stade appelerread_excel
(la nouvelle interface) pour chaque feuille, ou m'en tenir àx1.parse
?{sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
Vous devez spécifier explicitement le deuxième paramètre (nom de la feuille) comme Aucun. comme ça:
"df" sont toutes des feuilles en tant que dictionnaire de DataFrames, vous pouvez le vérifier en exécutant ceci:
résultat comme ceci:
veuillez vous référer au document pandas pour plus de détails: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
la source
C'est le moyen le plus rapide que j'ai trouvé, inspiré par la réponse de @ DivingTobi. Toutes Les réponses basées sur xlrd, openpyxl ou pandas sont lentes pour moi, car elles chargent toutes le fichier entier en premier.
la source
En vous basant sur la réponse de @dhwanil_shah, vous n'avez pas besoin d'extraire le fichier entier. Avec
zf.open
il est possible de lire directement à partir d'un fichier compressé.Les deux
readline
s consécutifs sont laids, mais le contenu n'est que dans la deuxième ligne du texte. Pas besoin d'analyser tout le fichier.Cette solution semble être beaucoup plus rapide que la
read_excel
version, et probablement aussi plus rapide que la version d'extrait complet.la source
J'ai essayé xlrd, pandas, openpyxl et d'autres bibliothèques similaires et elles semblent toutes prendre un temps exponentiel à mesure que la taille du fichier augmente à mesure qu'il lit le fichier entier. Les autres solutions mentionnées ci-dessus où ils utilisaient «on_demand» ne fonctionnaient pas pour moi. Si vous souhaitez simplement obtenir les noms de feuille au départ, la fonction suivante fonctionne pour les fichiers xlsx.
Étant donné que tous les xlsx sont essentiellement des fichiers compressés, nous extrayons les données xml sous-jacentes et lisons les noms de feuille directement à partir du classeur, ce qui prend une fraction de seconde par rapport aux fonctions de la bibliothèque.
Analyse comparative: (sur un fichier xlsx de 6 Mo avec 4 feuilles)
Pandas, xlrd: 12 secondes
openpyxl: 24 secondes
Méthode proposée: 0,4 seconde
Étant donné que mon exigence consistait simplement à lire les noms des feuilles, la surcharge inutile de la lecture tout le temps me dérangeait donc j'ai pris cette route à la place.
la source
zipfile
ce qui est un module intégré etxmltodict
que j'ai utilisé pour convertir le XML en un dictionnaire facilement itérable. Bien que vous puissiez consulter la réponse de @ivingTobi ci-dessous, vous pouvez lire le même fichier sans extraire réellement les fichiers qu'il contient.load_workbook(excel_file).sheetnames
en moyenne 8,24 s où enload_workbook(excel_file, read_only=True).sheetnames
moyenne 39,6 ms.Pour un fichier Excel de 5 Mo avec lequel je travaille,
load_workbook
sans leread_only
drapeau, cela a pris 8,24 s. Avec leread_only
drapeau, il n'a fallu que 39,6 ms. Si vous souhaitez toujours utiliser une bibliothèque Excel et ne pas passer à une solution xml, c'est beaucoup plus rapide que les méthodes qui analysent l'ensemble du fichier.la source