it-swarm.com.de

Wie konvertiere ich OpenDocument-Kalkulationstabellen in einen Pandas DataFrame?

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.

30
Lamps1829

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.

  • es gibt auch einige Brute-Force-Methoden, um direkt aus dem XML-Code zu lesen ( hier )
12
davidovitch

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: 

  • alle anderen nützlichen Parameter wie header, skiprows, index_col, parse_cols sind NICHT in dieser Funktion implementiert. Aktualisieren Sie diese Frage, wenn Sie sie implementieren möchten
  • ezodf hängt von lxml ab, und stellen Sie sicher, dass Sie es installiert haben
8
MaxU

Eine 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.

3
Lamps1829

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. 

2
CPBL

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")
1
Will Ayd

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.

1
Mike Adrion

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.

1
wordsforthewise

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.

0
Matthias Berth

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.

0

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.

0
iuvbio