web-dev-qa-db-ja.com

OpenDocumentスプレッドシートをpandas DataFrame?

Python library pandas は、Excelスプレッドシートを読み取り、pandas.read_Excel(file)コマンドでpandas.DataFrameに変換できます。 xlrd ライブラリ サポートしない odsファイル。

ODSファイルにpandas.read_Excelに相当するものはありますか?そうでない場合、Open Document Formattedスプレッドシート(​​odsファイル)でも同じことができますか? ODFはLibreOfficeおよびOpenOfficeで使用されます。

34
Lamps1829

ODF(Open Document Format .ods)Python以下のモジュールを使用したドキュメント):

Ezodfを使用すると、シンプルなODSからDataFrameへのコンバーターは次のようになります。

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)

PS

  • ODFスプレッドシート(​​ .odsファイル)のサポートは、pandas課題トラッカーでリクエストされています: https://github.com/pydata/pandas/issues/2311 、それでも実装されていません。

  • ezodfは、未完成の PR907 で使用され、pandasでODFサポートを実装しました。現在、そのPRは閉じられています(技術的な議論についてはPRを読んでください)が、まだ thispandas forkの実験的な機能として利用できます。

  • xMLコードから直接読み取るいくつかのブルートフォースメソッドもあります( here
13
davidovitch

ezodf モジュールを使用する迅速で汚いハックを次に示します。

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()})

テスト:

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

注:

  • headerskiprowsindex_colparse_colsはこの関数には実装されていません-それらを実装したい場合は、この質問を自由に更新してください。
  • ezodflxmlに依存します。インストールされていることを確認してください
8
MaxU

別のオプション: read-ods-with-odfpy 。このモジュールは、入力としてOpenDocumentスプレッドシートを受け取り、リストを返します。リストからデータフレームを作成できます。

3
Lamps1829

pandas read_clipboard。セルを選択してから、Excelまたはopendocumentからコピーします。python以下を実行します。

import pandas as pd
data = pd.read_clipboard()

パンダはコピーされたセルに基づいて良い仕事をします。

2
Mike Adrion

答えは「いいえ」のようです。そして、まだ乱雑なODSで読むためのツールを特徴付けます。 POSIXを使用している場合は、おそらく、Pandasのxlsx用の非常に優れたインポートツールを使用する前に、すぐにxlsxにエクスポートする戦略がオプションです。

unoconv -f xlsx -o tmp.xlsx myODSfile.ods 

全体として、私のコードは次のようになります。

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']

ここでfileOlderThan()は関数です( http://github.com/cpbl/cpblUtilities を参照)。tmp.xlsxが存在しないか、.odsファイルより古い場合にtrueを返します。

2
CPBL

読み取る.odsファイルが数個しかない場合は、openofficeで開いてExcelファイルとして保存します。多くのファイルがある場合、Linuxで unoconvコマンド を使用して、.odsファイルをプログラムで.xlsに変換できます( with bash

その後、pd.read_Excel('filename.xls')を使用して読み込むのは本当に簡単です

2
wordsforthewise

これはpandas 0.25でネイティブに利用可能です。odfpyがインストールされている限り、

pd.read_Excel("the_document.ods", engine="odf")
1
Will Ayd

Pandas(xlsとxlsxの両方)でExcelファイルの読み取りがサポートされています。 read_Excel コマンドを参照してください。OpenOfficeを使用して、スプレッドシートをxlsxとして保存できます。 convert-toコマンドラインパラメーター を使用して、明らかにコマンドラインで自動的に実行することもできます。

Xlsxからデータを読み取ることにより、CSVに最初に変換するときに発生する可能性のある問題(日付形式、数値形式、Unicode)を回避できます。

0
Matthias Berth

可能であれば、スプレッドシートアプリケーションからCSVとして保存し、pandas.read_csv()を使用します。 「ods」スプレッドシートファイルであるIIRCは、実際にはXMLファイルであり、かなりのフォーマット情報も含まれています。したがって、表形式のデータに関する場合は、この生データを最初に中間ファイル(この場合はCSV)に抽出し、Python/pandasなどの他のプログラムで解析できます。

0

Davidovitch(ありがとう)の回答に大きく基づいて、.odsファイルを読み込んでDataFrameを返す package をまとめました。彼のPRのようなpandas自体の完全な実装ではありませんが、仕事をする簡単なread_ods関数を提供します。

pip install pandas_ods_readerでインストールできます。ファイルにヘッダー行が含まれるかどうかを指定したり、カスタム列名を指定したりすることもできます。

0
iuvbio