Python library pandas は、Excelスプレッドシートを読み取り、pandas.read_Excel(file)
コマンドでpandas.DataFrame
に変換できます。 xlrd ライブラリ サポートしない odsファイル。
ODSファイルにpandas.read_Excel
に相当するものはありますか?そうでない場合、Open Document Formattedスプレッドシート(odsファイル)でも同じことができますか? ODFはLibreOfficeおよびOpenOfficeで使用されます。
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の実験的な機能として利用できます。
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
注:
header
、skiprows
、index_col
、parse_cols
はこの関数には実装されていません-それらを実装したい場合は、この質問を自由に更新してください。ezodf
はlxml
に依存します。インストールされていることを確認してください別のオプション: read-ods-with-odfpy 。このモジュールは、入力としてOpenDocumentスプレッドシートを受け取り、リストを返します。リストからデータフレームを作成できます。
pandas read_clipboard。セルを選択してから、Excelまたはopendocumentからコピーします。python以下を実行します。
import pandas as pd
data = pd.read_clipboard()
パンダはコピーされたセルに基づいて良い仕事をします。
答えは「いいえ」のようです。そして、まだ乱雑な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を返します。
読み取る.odsファイルが数個しかない場合は、openofficeで開いてExcelファイルとして保存します。多くのファイルがある場合、Linuxで unoconv
コマンド を使用して、.odsファイルをプログラムで.xlsに変換できます( with bash )
その後、pd.read_Excel('filename.xls')
を使用して読み込むのは本当に簡単です
これはpandas 0.25でネイティブに利用可能です。odfpyがインストールされている限り、
pd.read_Excel("the_document.ods", engine="odf")
Pandas(xlsとxlsxの両方)でExcelファイルの読み取りがサポートされています。 read_Excel コマンドを参照してください。OpenOfficeを使用して、スプレッドシートをxlsxとして保存できます。 convert-toコマンドラインパラメーター を使用して、明らかにコマンドラインで自動的に実行することもできます。
Xlsxからデータを読み取ることにより、CSVに最初に変換するときに発生する可能性のある問題(日付形式、数値形式、Unicode)を回避できます。
可能であれば、スプレッドシートアプリケーションからCSVとして保存し、pandas.read_csv()
を使用します。 「ods」スプレッドシートファイルであるIIRCは、実際にはXMLファイルであり、かなりのフォーマット情報も含まれています。したがって、表形式のデータに関する場合は、この生データを最初に中間ファイル(この場合はCSV)に抽出し、Python/pandasなどの他のプログラムで解析できます。
Davidovitch(ありがとう)の回答に大きく基づいて、.odsファイルを読み込んでDataFrameを返す package をまとめました。彼のPRのようなpandas
自体の完全な実装ではありませんが、仕事をする簡単なread_ods
関数を提供します。
pip install pandas_ods_reader
でインストールできます。ファイルにヘッダー行が含まれるかどうかを指定したり、カスタム列名を指定したりすることもできます。