Die neue Version von Pandas verwendet die folgende Oberfläche zum Laden von Excel-Dateien:
read_excel('path_to_file.xls', 'Sheet1', index_col=None, na_values=['NA'])
aber was ist, wenn ich die verfügbaren Blätter nicht kenne?
Zum Beispiel arbeite ich mit Excel-Dateien, die die folgenden Blätter
Daten 1, Daten 2 ..., Daten N, foo, bar
aber ich weiß nicht N
a priori.
Gibt es eine Möglichkeit, die Liste der Blätter aus einem Excel-Dokument in Pandas abzurufen?
ExcelFile
? Angenommen, ich schaue in der Liste der Blätter nach und entscheide mich, N davon zu laden. Soll ich an diesem Punktread_excel
(die neue Schnittstelle) für jedes Blatt aufrufen oder mich daran haltenx1.parse
?{sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
Sie sollten den zweiten Parameter (Blattname) explizit als Keine angeben. so was:
"df" sind alle Blätter als Wörterbuch von DataFrames. Sie können dies überprüfen, indem Sie Folgendes ausführen:
Ergebnis wie folgt:
Weitere Informationen finden Sie im Pandas-Dokument: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html
quelle
Dies ist der schnellste Weg, den ich gefunden habe, inspiriert von der Antwort von @ divingTobi. Alle Die Antworten basierend auf xlrd, openpyxl oder pandas sind für mich langsam, da alle zuerst die gesamte Datei laden.
quelle
Aufbauend auf der Antwort von @dhwanil_shah müssen Sie nicht die gesamte Datei extrahieren. Mit ist
zf.open
es möglich, direkt aus einer komprimierten Datei zu lesen.Die zwei aufeinanderfolgenden
readline
s sind hässlich, aber der Inhalt befindet sich nur in der zweiten Zeile des Textes. Sie müssen nicht die gesamte Datei analysieren.Diese Lösung scheint viel schneller als die
read_excel
Version zu sein und höchstwahrscheinlich auch schneller als die vollständige Extraktversion.quelle
Ich habe xlrd, pandas, openpyxl und andere solche Bibliotheken ausprobiert und alle scheinen exponentielle Zeit in Anspruch zu nehmen, wenn die Dateigröße zunimmt, während die gesamte Datei gelesen wird. Die anderen oben genannten Lösungen, bei denen 'on_demand' verwendet wurde, funktionierten bei mir nicht. Wenn Sie zunächst nur die Blattnamen abrufen möchten, funktioniert die folgende Funktion für XLSX-Dateien.
Da es sich bei allen xlsx im Grunde genommen um komprimierte Dateien handelt, extrahieren wir die zugrunde liegenden XML-Daten und lesen die Blattnamen direkt aus der Arbeitsmappe, was im Vergleich zu den Bibliotheksfunktionen einen Bruchteil einer Sekunde dauert.
Benchmarking: (Auf einer 6-MB-xlsx-Datei mit 4 Blättern)
Pandas, xlrd: 12 Sekunden
openpyxl: 24 Sekunden
Vorgeschlagene Methode: 0,4 Sekunden
Da ich nur die Blattnamen lesen musste, nervte mich der unnötige Aufwand beim Lesen der gesamten Zeit, sodass ich stattdessen diesen Weg einschlug.
quelle
zipfile
ein eingebautes Modul verwendet, mitxmltodict
dem ich das XML in ein leicht iterierbares Wörterbuch konvertiert habe. Sie können sich jedoch die Antwort von @ divingTobi unten ansehen, in der Sie dieselbe Datei lesen können, ohne die darin enthaltenen Dateien tatsächlich zu extrahieren.load_workbook(excel_file).sheetnames
durchschnittlich 8,24 s, woload_workbook(excel_file, read_only=True).sheetnames
durchschnittlich 39,6 ms.Für eine 5-MB-Excel-Datei, mit der ich arbeite, dauerte
load_workbook
dasread_only
Flag 8,24 Sekunden. Mit derread_only
Flagge dauerte es nur 39,6 ms. Wenn Sie weiterhin eine Excel-Bibliothek verwenden und nicht zu einer XML-Lösung wechseln möchten, ist dies viel schneller als die Methoden, mit denen die gesamte Datei analysiert wird.quelle