LoginSignup
5
7

More than 5 years have passed since last update.

PythonでLibreOffice Calcファイルを読み込む

Last updated at Posted at 2018-08-13

実行した環境

Ubuntu Stdio 18.04LTS
Python 3.6.5

参考

How to convert OpenDocument spreadsheets to a pandas DataFrame?
https://stackoverflow.com/questions/17834995/how-to-convert-opendocument-spreadsheets-to-a-pandas-dataframe

pandas.read_excel()と言うExcelを読み込んだり、いろいろ出来る関数があるのを今日知ったのですが、私はUbuntuを使用しているので使えません。残念

それで色々検索していたら、LibreOffice Calcを読み込むパッケージがあると言うことで、インストールしました。

注意)

上記の参考にも書いてあるように、あくまでも実験の段階で、色々な機能はありません。

 ODFスプレッドシート(​​ .odsファイル)のサポートは、 pandas問題追跡ツール: https : //github.com/pydata/pandas/issues/2311で要求されていますが 、まだ実装されていません。

 ezodfは未完成のPR9070で、パンダでODFサポートを実装するために使用されました。 そのPRは現在閉鎖されています(技術的な話し合いのためにPRを読んでください)が、 この pandasフォークの実験的な機能としてまだ利用可能です。
    XMLコード( ここでは )から直接読み込むいくつかの強引な方法もあります

 header 、 skiprows 、 index_col 、 parse_colsような他の有用なパラメータはこの関数では実装されていません。実装したい場合はこの質問を更新してください

インストール

(Ubuntu Studio 18.04の場合)

$ pip3 search pandas //検索
pandas (0.23.4)                    - Powerful data structures for data
                                     analysis, time series, and statistics

$ pip3 search ezodf
ezodf (0.3.2)          - A Python package to create/manipulate
                         OpenDocumentFormat files.

$ pip3 install pandas //インストール

$ pip3 install ezodf
#!/usr/bin/python3
# coding: UTF-8

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

df = read_ods(filename='fn.ods') 
print(df)

image.png

image.png

使い物になるか?

<class 'pandas.core.frame.DataFrame'>
typeで調べるとpandas DataFrame??
まったく知識がないので、ネットのサイトを参考にして行います。

RemrinのPython攻略日記さんのサイトを参考にします。
http://python-remrin.hatenadiary.jp/entry/2017/05/08/212120

*データフレームを作る(2)リストから

import numpy as np
import pandas as pd

d =[[1, 2, 3], 
    [50, 60, 70]]
frame = pd.DataFrame(d)

print(frame)
print(frame.T) # .Tで行列変換(転置)
print(frame)
#     0   1   2
# 0   1   2   3
# 1  50  60  70

print(frame.T)
#    0   1
# 0  1  50
# 1  2  60
# 2  3  70

ezodfでCalcから読み込んで実行

#!/usr/bin/python3
# coding: UTF-8

import pandas as pd 
import ezodf
import sys

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

d = read_ods(filename = 'リストからデータフレームを作る.ods')

print(d)
print(d.T)

image.png

ちゃんと動作しています。

後、いろいろやって見ましたが全てができる訳ではないようです。

Intro to Data Structuresさんのサイトを参考にします。
https://pandas.pydata.org/pandas-docs/stable/dsintro.html

import pandas as pd 

d = {'one' : [1., 2., 3., 4.],
     'two' : [4., 3., 2., 1.]}

print(pd.DataFrame(d))
'''
   one  two
0  1.0  4.0
1  2.0  3.0
2  3.0  2.0
3  4.0  1.0
'''

print(pd.DataFrame(d, index=['a', 'b', 'c', 'd']))
'''
   one  two
a  1.0  4.0
b  2.0  3.0
c  3.0  2.0
d  4.0  1.0
'''

ezodfでindexを変更します。

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

d = read_ods(filename = 'index変更.ods')

print(d)

print(pd.DataFrame(d, index=['a', 'b', 'c', 'd']))

image.png

indexは変更されていますが、他のデータがNaNになってしまいます。
これ以外は、大体できていると思います。
全てをやった訳でもないので、まだ不具合がでる可能性もあります。

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7