Die Python-Bibliothek pandas kann Excel-Kalkulationstabellen lesen und sie mit dem Befehl pandas.read_Excel(file)
in einen pandas.DataFrame
konvertieren. Unter der Haube verwendet sie xlrd library, die keine ods-Dateien unterstützt.
Gibt es ein Äquivalent zu pandas.read_Excel
für ods-Dateien? Wenn nicht, wie kann ich dasselbe für eine Open Document Formatierte Tabelle (ODS-Datei) tun? ODF wird von LibreOffice und OpenOffice verwendet.
Sie können ODF-Dokumente (Open Document Format .ods
) in Python mit den folgenden Modulen lesen:
Bei Verwendung von ezodf könnte ein einfacher ODS-zu-DataFrame-Konverter folgendermaßen aussehen:
import pandas as pd
import ezodf
doc = ezodf.opendoc('some_odf_spreadsheet.ods')
print("Spreadsheet contains %d sheet(s)." % len(doc.sheets))
for sheet in doc.sheets:
print("-"*40)
print(" Sheet name : '%s'" % sheet.name)
print("Size of Sheet : (rows=%d, cols=%d)" % (sheet.nrows(), sheet.ncols()) )
# convert the first sheet to a pandas.DataFrame
sheet = doc.sheets[0]
df_dict = {}
for i, row in enumerate(sheet.rows()):
# row is a list of cells
# assume the header is on the first row
if i == 0:
# columns as lists in a dictionary
df_dict = {cell.value:[] for cell in row}
# create index for the column headers
col_index = {j:cell.value for j, cell in enumerate(row)}
continue
for j, cell in enumerate(row):
# use header instead of column index
df_dict[col_index[j]].append(cell.value)
# and convert to a DataFrame
df = pd.DataFrame(df_dict)
_/P.S.
Die ODF-Tabellenkalkulationsdatei (* .ods-Dateien) wurde im pandas
issue tracker: https://github.com/pydata/pandas/issues/2311 angefordert, ist aber immer noch nicht implementiert.
ezodf
wurde im unvollendeten PR9070 verwendet, um die ODF-Unterstützung in Pandas zu implementieren. Diese PR ist jetzt geschlossen (lesen Sie die PR für eine technische Diskussion), sie steht jedoch weiterhin als experimentelle Funktion in thispandas
fork zur Verfügung.
Hier ist ein schneller und schmutziger Hack, der ezodf module verwendet:
import pandas as pd
import ezodf
def read_ods(filename, sheet_no=0, header=0):
tab = ezodf.opendoc(filename=filename).sheets[sheet_no]
return pd.DataFrame({col[header].value:[x.value for x in col[header+1:]]
for col in tab.columns()})
Prüfung:
In [92]: df = read_ods(filename='fn.ods')
In [93]: df
Out[93]:
a b c
0 1.0 2.0 3.0
1 4.0 5.0 6.0
2 7.0 8.0 9.0
ANMERKUNGEN:
header
, skiprows
, index_col
, parse_cols
sind NICHT in dieser Funktion implementiert. Aktualisieren Sie diese Frage, wenn Sie sie implementieren möchtenezodf
hängt von lxml
ab, und stellen Sie sicher, dass Sie es installiert habenEine weitere Option: read-ods-with-odfpy . Dieses Modul nimmt eine OpenDocument-Kalkulationstabelle als Eingabe und gibt eine Liste zurück, aus der ein DataFrame erstellt werden kann.
Anscheinend lautet die Antwort Nein! Und ich würde die Werkzeuge charakterisieren, die in ODS immer noch unregelmäßig gelesen werden sollen. Wenn Sie POSIX verwenden, ist es vielleicht die Strategie, schnell nach xlsx zu exportieren, bevor Sie Pandas sehr Nice-Import verwenden Tools für Xlsx ist eine Option:
unoconv -f xlsx -o tmp.xlsx myODSfile.ods
Insgesamt sieht mein Code so aus:
import pandas as pd
import os
if fileOlderThan('tmp.xlsx','myODSfile.ods'):
os.system('unoconv -f xlsx -o tmp.xlsx myODSfile.ods ')
xl_file = pd.ExcelFile('tmp.xlsx')
dfs = {sheet_name: xl_file.parse(sheet_name)
for sheet_name in xl_file.sheet_names}
df=dfs['Sheet1']
Hier ist fileOlderThan () eine Funktion (siehe http://github.com/cpbl/cpblUtilities ), die true zurückgibt, wenn tmp.xlsx nicht vorhanden ist oder älter ist als die ODS-Datei.
Dies ist nativ in pandas 0.25 verfügbar. Solange Sie odfpy installiert haben, können Sie dies tun
pd.read_Excel("the_document.ods", engine="odf")
Ich hatte viel Glück mit pandas read_clipboard . Zellen auswählen und dann aus Excel oder opendocument ..__ kopieren. In python folgendes ausführen.
import pandas as pd
data = pd.read_clipboard()
Pandas werden gute Arbeit leisten, basierend auf den kopierten Zellen.
Wenn Sie nur wenige .ods-Dateien lesen müssen, würde ich sie einfach in openoffice öffnen und als Excel-Datei speichern. Wenn Sie über viele Dateien verfügen, können Sie mit dem unoconv
-Befehl unter Linux die ODS-Dateien programmatisch in .xls konvertieren ( with bash ).
Dann ist es sehr einfach, es mit pd.read_Excel('filename.xls')
einzulesen.
Es gibt Unterstützung für das Lesen von Excel-Dateien in Pandas (sowohl xls als auch xlsx), siehe den Befehl read_Excel . Sie können OpenOffice verwenden, um die Tabelle als xlsx zu speichern. Die Konvertierung kann anscheinend auch automatisch in der Befehlszeile mit dem Befehlszeilenparameter convert-to erfolgen.
Durch das Lesen der Daten aus xlsx werden einige Probleme (Datumsformate, Zahlenformate, Unicode) vermieden, die beim ersten Konvertieren in CSV auftreten können.
Wenn möglich, als CSV-Datei aus der Tabellenkalkulationsanwendung speichern und dann pandas.read_csv()
verwenden. IIRC, eine "ods" -Tabelle, ist eigentlich eine XML-Datei, die auch einige Formatierungsinformationen enthält. Wenn es sich um Tabellendaten handelt, extrahieren Sie diese Rohdaten zuerst in eine Zwischendatei (in diesem Fall CSV), die Sie dann mit anderen Programmen wie Python/Pandas analysieren können.
Basierend auf der Antwort von davidovitch (danke) habe ich ein package zusammengestellt, das eine .ods-Datei einliest und einen DataFrame zurückgibt. Es ist keine vollständige Implementierung in pandas
selbst, wie z. B. seinem PR, aber es bietet eine einfache read_ods
-Funktion, die die Aufgabe erfüllt.
Sie können es mit pip install pandas_ods_reader
installieren. Sie können auch angeben, ob die Datei eine Kopfzeile enthält oder nicht, und benutzerdefinierte Spaltennamen angeben.