wir wollen Daten analysen, oder? Sonst wärt ihr ja nicht hier! Dazu müssen aber erstmal die Daten in Python importiert werden. Neben Datenbanken sind Dateien das Mittel zum Zweck. Und im Data Science Umfeld sind die Dateien zum großen Teil im Format csv (comma separated value), aber erstaunlich oft eben auch im Excel-Format (xlsx), denn in fast allen Abteilungen einer Firma ist Excel immer noch die Software, mit der Tabellen bearbeitet werden.
Ich zeige euch, wie ihr Excel in Python einlesen könnt. Das ist mit dem richtigen Package überhaupt nicht schwer.
Inhalt
Python: Excel einlesen
Ihr habt die Qual der Wahl. Es gibt nämlich einige Möglichkeiten, xlsx-Dateien nach Python zu bringen. Wollt ihr nur schnell Daten aus einer Excel-Datei holen, dann ist pandas wohl am besten geeignet. Braucht ihr noch mehr Kontrolle oder wollt Formeln auslesen, dann schaut euch xlrd oder openpyxl an. Tatsächlich nutzt pandas xlrd im Hintergrund, um auf die Excel-Daten zuzugreifen.
Eine Jupyter Notebook-Datei mit dem Code für alle drei Möglichkeiten findest Du hier.
xlsx-Dateien mit pandas importieren
Eine populäre Methode, Excel-Dateien in Python einzulesen, ist mit der read_excel-Funktion von pandas. Wenn man als Data Scientist mit Python arbeitet, ist pandas sowieso unverzichtbar. Die read_excel-Funktion kann sowohl xls- (altes Format) als auch xlsx-Dateien verarbeiten und schreibt den Inhalt in ein DataFrame.
import pandas as pd df = pd.read_excel(“Dateiname“)
dazu gibt es eine ganze Reihe von Parametern, die wichtigsten findet ihr hier:
sheet_name = 0
Hier kann man eine Zahl (beginnend bei 0) oder den Namen des Arbeitsblatts. Standardmäßig wird also das erste Arbeitsblatt eingelesen. Gibt man hier eine Liste an, dann wird ein Dictionary von DataFrames zurückgegeben (siehe unten)skiprows = None
Will man die ersten Zeilen überspringen, was ja relativ typisch für Excel-Tabellen ist, denn oben sollte hoffentlich Titel und Beschreibung stehen, geht das mit diesem Parameter, der einfach sagt, wie viele Zeilen man überspringen will. Wie in Python üblich, fängt das Zählen bei 0 an, d.h. wenn ich ab der 4. Zeile einlesen will, benutze ich skiprows=3.header = 0
Die Zeile, in der der Header, also die Spaltenüberschriften steht. Bei 0 wird also die erste Zeile verwendet. Gibt es keine Spaltenüberschriften, gibt man None an.names = None
Diesem Parameter kann man eine Liste mit den Spaltennamen übergebenusecols = None
Hier gibt man an, dass man nur ausgewählte Spalten einlesen möchte. Dafür übergibt man am besten eine Liste mit Spaltennummern oder Spaltennamen.dtype = None
Möchte man andere Datentypen als die automatisch erkannten verwenden, kann man ein dictionary mit den Datentypen der Spalten angeben.nrows = None
Möchte man nicht alle Zeilen einlesen, kann man das mit dem Parameter nrows begrenzen.
Das sollte die meisten Anwendungsfälle abdecken. Braucht ihr noch weitere Spezialisierungen, dann schaut in die API Referenz von read_excel.
Mehrere Excel-Arbeitsblätter gleichzeitig importieren
Wie bei der Erklärung zum Parameter sheet_name geschrieben, kann man dort auch eine Liste mit den Arbeitsblatt-Nummern oder –Namen angeben. Dann wird kein DataFrame zurückgegeben, sondern ein Dictionary von DataFrames.
Mappe = pd.read_excel("Beispiel-Excel.xlsx", sheet_name=['Tabelle1','Tabelle2','Tabelle3'], skiprows=3) print(type(Mappe)) print(Mappe.keys()) print(Mappe['Tabelle3'].head())
Datenanalyse mit Python - 5 Tage Minikurs
Excel-Datei importieren mit dem Package xlrd
Mit dem Package xlrd habt ihr deutlich mehr Kontrolle über die Excel-Arbeitsmappe, aber es ist natürlich auch ein bisschen aufwändiger. Tatsächlich wird aber xlrd aktuell nicht mehr weiterentwickelt. Auf der GitHub-Seite steht, dass man doch besser openpyxl verwenden soll.
Neben xlrd zum Lesen gibt es auch xlwt zum Schreiben von xls-Dateien (Excel 97 – 2003) und xlutils, wenn man Excel-Dateien modifizieren will.
Leicht ist erstmal das Öffnen der Datei
wb = xlrd.open_workbook("Beispiel-Excel.xlsx")
Mit sheet_names bekommt man die Namen der Arbeitsblätter
sheet_names = wb.sheet_names()
Ein Arbeitsblatt kann man dann über den Namen ansprechen, also z.B.
Tab1 = wb.sheet_by_name('Tabelle1')
Die xlrd API ist sehr logisch aufgebaut und sollte für Leute, die schon mal APIs gelesen haben, kein Problem darstellen.
- Das Modul book beinhaltet alles für den Umgang mit der gesamten Arbeitsmappe. Die Klasse xlrd.book.Book enthält den Inhalt der Arbeitsmappe.
- Das Modul sheet beinhaltet alles für den Umgang mit einem Arbeitsblatt. Die zugehörige Klasse xlrd.sheet.Sheet enthält den Inhalt eines Arbeitsblatts
- formatting ist noch erwähnenswert, wenn man die Formatierungen auslesen will
- formula befasst sich (Achtung) nicht mit den Formeln einer Zelle, sondern mit dem Namensmanager. Will man die Formeln einzelner Zellen auslesen, geht das mit openpyxl oder
- xldate hilft beim Umgang mit Datum und Zeit
Python-Package openpyxl: Excel-Dateien einlesen
Openpyxl scheint aktuell das Package zu sein, welches man nutzen sollte, will man mehr machen als Daten einlesen. Im letzteren Fall ist meiner Meinung nach pandas zu bevorzugen.
Eine Arbeitsmappe einzulesen ist auch hier super einfach.
from openpyxl import load_workbook wb2 = load_workbook("Beispiel-Excel.xlsx")
Mit dem Flag data_only kann man einstellen, ob Formeln oder die berechneten Werte eingelesen werden sollen. Standardmäßig ist data_only = False, es werden also Formeln eingelesen.
Leider werden Bilder und Charts nicht mit eingelesen, so dass Modifikationen einer Vorlage oder das Einfüllen von Daten in bestehende Excel-Dashboards mit openpyxl nicht vernünftig funktionieren. Dafür scheint xlwings das richtige Tool zu sein, dazu demnächst mehr.
Aber zurück zu openpyxl. Die Arbeitsmappe enthält die Arbeitblätter, auf die dann einfach per Namen zurückgegriffen werden kann
print(wb2.sheetnames) ws = wb2['Tabelle1'] for i in ws.values: print(i)
Um die Daten in ein pandas DataFrame umzuwandeln, könnte man es folgendermaßen machen. In dem Beispiel fängt die Tabelle in Zeile 4 an.
import pandas as pd df = pd.DataFrame(ws.values) df.columns = df.iloc[[3]].values.tolist()[0] df = df[4:] df.head()
Auch hier wieder der Verweis auf die Dokumentation von openpyxl. Interessant ist auch das Kapitel 12 im kostenlosen Buch Automate the boring stuff, dort geht es tatsächlich um Anwendung vom Package openpyxl.
Python: Excel abspeichern
Logisch, neben dem Einlesen von Excel-Dateien wollen wir natürlich auch Excel-Dateien abspeichern können. Eine Jupyter Notebook-Datei mit dem Code für alle drei Möglichkeiten findest Du hier.
Einen DataFrame mit pandas in eine xlsx-Datei schreiben
Mit pandas ist es wieder sehr leicht, einen DataFrame in eine Excel-Datei zu schreiben. Das geht über die Funktion to_excel, also z.B.
diamonds.to_excel("Diamonds.xlsx", sheet_name='Diamonds')
Dabei gibt es folgende Parameter zur Individualisierung. Es gibt noch ein paar mehr, aber gebraucht habe ich die bisher nicht.
na_rep = ''
Wie sollen fehlende Werte dargestellt werden. Standard ist hier leer.float_format=None
Hier kann das Format für Kommazahlen angegeben werdencolumns = None
Wenn nicht alle Spalten geschrieben werden sollen, dann kann man diese hier spezifizierenheader = True
Sollen Spaltennamen geschrieben werden. Es geht auch eine Liste mit den Spaltennamen.index = True
Flag, ob ein Zeilenindex geschrieben werden soll.index_label = None
Der Spaltenname für die Index-Spaltestartrow = 0
Die Zeile in der Excel-Datei, ab der die Tabelle geschrieben werden sollstartcol = 0
Die Spalte in der Excel-Datei, ab der die Tabelle geschrieben werden soll
Datenanalyse mit Python – 5 Tage Minikurs
Mehrere Arbeitsblätter in eine Excel-Datei schreiben
Auch das ist mit pandas kein Problem. Allerdings muss man dazu einen ExcelWriter verwenden. Das geht folgendermaßen:
with pd.ExcelWriter('test.xlsx') as writer: iris.to_excel(writer, sheet_name='iris') tips.to_excel(writer, sheet_name='tips')
Eine Excel-Datei mit xlwt schreiben
Das Schreiben einer xls-Datei (Achtung, xlwt unterstützt nicht das neue xlsx-Format, welches seit Excel 2007 verwendet wird)
import xlwt from datetime import datetime wb = xlwt.Workbook() ws = wb.add_sheet('Tabelle1') datumStyle = xlwt.easyxf(num_format_str='DD.MM.YYYY') ws.write(0, 0, 1) ws.write(0, 1, 1) ws.write(0, 2, xlwt.Formula("A1+B1")) ws.write(1, 0, datetime.now(),datumStyle) ws.write(1, 2, 3.1415) wb.save('Beispiel-xlwt.xls')
Eine Excel-Datei mit openpyxl schreiben
Das Schreiben der Datei ist wieder überhaupt kein Problem:
from openpyxl import Workbook wb = Workbook() # … Arbeitsmappe befüllen … wb.save("Beispiel-openpyxl.xlsx")
Als Zwischenteil können wir zum Beispiel folgendes machen:
# Das erste Arbeitsblatt aktivieren ws = wb.active # Man kann direkt in Zellen schreiben ws['C1'] = 3.1415 # Auch ganze Zeilen können angehangen werden ws.append([1, 2, 3]) # Datumsfelder funktionieren auch import datetime ws['E2'] = datetime.datetime.now()
Fazit zu Excel-Dateien mit Python
Nochmal kurz zusammengefasst, lässt sich sagen:
Wollt ihr nur Tabellen einlesen bzw in eine Excel-Datei schreiben, dann benutz am besten pandas. Die Import- bzw. Export-Funktion ist einfach anzuwenden und pandas Datentyp DataFrame ist sowieso ideal, um die Daten weiter zu verarbeiten.
Braucht ihr mehr Kontrolle und wollt einzelne Zellen, Formate etc. auslesen oder bearbeiten, benutzt openpyxl. Falls ihr aus unerfindlichen Gründen noch das xls-Format verwenden müsst (ja, das gibt es in manchen Firmen noch), dann verwendet xlrt/xlwt/xlutils.
Ich hoffe, ihr habt was Nützliches mitgenommen. Schreibt mir einen Kommentar, welches Package ihr am liebsten verwendet. Und wenn ihr helfen wollt, Data Science Wissen zu verbreiten und mich damit unterstützt, dann teilt den Beitrag auf Twitter oder Facebook.
Happy Exceling,
Euer Holger
Schön, dass es diese Seite gibt. Ich habe xlrd unter Windows installiert: pip install xlrd. Der erste Skrip-Versuch zum Laden erinre text.xlsx-Datei scheiterte mit der Fehlermeldung: Excel xlsx file; not supported. Anscheinend funktioniert es nur mit dem veralteten Excel 97-2003 xls-Format. Schade, abewr in dem Punkt ist diese Beispielseite nicht sehr hilfreich.Der Link zu GitHub wird mit Fehler 404 quittiert. Anscheinend steht das Projekt auf dem Stand von 12/2020 stehen. Nächster Schritt: pip uninstall xlrd
Hallo Martin,
Du hast völlig recht. xlrd unterstützt nur das mittlerweile uralte xls-Format. Ich schreibe es demnächst in den Artikel, damit es keine Verwirrung gibt.
Wenn Du nur Tabellen einlesen und schreiben willst, empfehle ich pandas. Das hat bei mir noch nie für Probleme gesorgt und der DataFrame ist eh das Format, um Tabellen vernünftig zu bearbeiten.
Willst Du eine Excel-Datei richtig bearbeiten (mit Formeln, bedingter Formatierung, …), dann ist das Package openpyxl meiner Meinung nach am besten geeignet.
Viele Grüße, Holger