2025-03-25

【備忘録】Pandas で ODS ファイルを読み込む

Pandas は、プログラミング言語 Python において、データ解析を支援する機能を提供するライブラリです。特に、数表および時系列データを操作するためのデータ構造と演算を提供します。Pandas は BSD ライセンスのもとで提供されています。Pandas の 開発により、R 言語における DataFrame が扱える「ベクトル処理」の操作性と同等な機能が導入されました。

Wikipedia より引用、編集

Pandas で Excel ファイルをデータフレームに読み込むには pandas.read_excel() 関数を使いますが [1]、名前の通り Excel ファイルを読み込むためだけの関数だと思い込んでいました。

自分のメイン PC の OS は Linux (Fedora Linux) ですので、普段使いのスプレッドシートは LibreOffice Calc になります。この Calc は Excel ファイルの読み書きができるので、Windows 上で作成した Excel ファイルを Linux 上で読み書きするのには不自由しません。一方、Excel ファイルで Windows とのやりとりを考慮しなくとも良い場合には、Calc デフォルトの ODS 形式(OpenDocument Spreadsheet, 拡張子 .ods)で保存しています。)

この ODS 形式のファイルを Pandas で読み込む方法を調べたところ、Excel の時と同じ pandas.read_excel() 関数にたどり着きました。Pandas で Excel ファイルを扱うために openpyxlxlrd という Excel ファイルを読み書きするパッケージをあらかじめインストールしておく必要があるのと同じように、ODS 形式のファイルを読み込むときには、あらかじめ odfpy [2] というパッケージをインストールしておけば良いことが判りました

判りました」と書いたのは、pandas.read_excel() 関数のマニュアル [3] のパラメータ engine の説明に、

If path_or_buffer is an OpenDocument format (.odf, .ods, .odt), then odf will be used.

とあったので、早速 pip install odfodf パッケージをインストールしたのですが、pandas.read_excel() 関数ではエラーが出て ODF ファイルを読み込めなかったからです。

上記マニュアルページの odf の文字列部分にリンクが張ってあったのでクリックしたところ PyPi の odfpy のページが開きました。ここでインストールするパッケージを間違えたことに気づいたので、odf をアンインストールして、odfpy をインストール。そして ODF 形式のファイルを読み込めることを確認出来ました。

ちょっとハマってしまった間違いだったので備忘録にしました。

参考サイト

  1. pandasでExcelファイル(xlsx, xls)の読み込み(read_excel) | note.nkmk.me
  2. odfpy · PyPI
  3. pandas.read_excel — pandas documentation

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



2025-03-13

【備忘録】Jupyter Lab で上位階層のライブラリをインポート

Python で GUI アプリを作るとき、自分の場合、プロジェクトのルートにメイン・プログラム app.py などを置き、アプリの処理は、機能別に名前を付けたサブディレクトリ内の Python ファイルに用意して、メイン・プログラムからインポートして利用する、といった構成にしています。IDE はもっぱら PyCharm Community 版を使っています。

GUI のレイアウトは、その都度プログラムを起動して確認する、という効率の悪いやり方で良しとしていますが、GUI とは関係が無い関数の機能をテストする際には、Jupyter Lab で対象の関数をインポートして確認しています。

Jupyter Lab の .ipynb ファイルをメイン・プログラムと同じルートに置けば、メイン・プログラムと同じようにインポートができて都合が良いのですが、ルートに .ipynb ファイルがうじゃうじゃ増えてしまって煩わしいです。そこで、jupyter というディレクトリを作って .ipynb ファイルをまとめて置くようにしています。

そうすると、対象の関数をインポートするために一手間かける必要があります。いろいろ試して、結局、なんてことはないやりかたに落ち着きましたが、もっと良いやり方が見つかるかもしれないので備忘録にしました。

下記の OS 環境で動作確認をしています。

Fedora Linux 41 Workstation x86_64
Python 3.13.2
PyCharm Community Edition 2024.3.4
jupyterlab 4.3.5

説明用に下記のプロジェクトを使います。

メイン・プログラムが app.py、テストする関数が funcs/myfunc.py 内に記載されている myfunc01、この関数を Jupyter Lab を起動して jupyter/myfunc.py でテストするというケースです。以下は、例示用に用意した PyCharm のプロジェクトです。

 

funcs/myfunc.py 内に記載されている myfunc01True を返すだけの関数です。

funcs/myfunc.py
def myfunc01() -> bool:
    return True

Jupyter Lab 上でのテスト

Jupyter Lab を起動してテスト用に使う jupyter/myfunc01_test.ipynb は、テスト対象の関数 myfunc01 をインポートする前に、以下のように一つ上のパスをシステムパスに追加します。

jupyter/myfunc01_test.ipynb
import sys
path_up = '..'
if not path_up in sys.path:
    sys.path.append(path_up)

myfunc01 を実行すると確かに True が返ってきます。

from funcs.myfunc import myfunc01
 
myfunc01()
True

念のため、システムのパスを確認しました。

sys.path
['/usr/lib64/python313.zip',
 '/usr/lib64/python3.13',
 '/usr/lib64/python3.13/lib-dynload',
 '',
 '/home/bitwalk/PycharmProjects/PythonProject/.venv/lib64/python3.13/site-packages',
 '/home/bitwalk/PycharmProjects/PythonProject/.venv/lib/python3.13/site-packages',
 '..']

結局 .. をシステムパスに追加するだけで用が足りてしまいました。Jupyter Lab 上で何回も実行してしまう可能性がありますので、一応、システムパスに .. が含まれているか確認してはいますが、なんだこれだけか…記事にするほどの内容でなかったかもしれません。

もともと Jupyter Lab では __file__ が定義されていない、ということから始まった調査だったのですが、記事公開直前に迷走してあれこれ調べ直している中で、参考サイト [3] で、__file__'__file__'"__file__" の違いを知りました。結局どれも使わなかったのですが…。

Python について、ちょっとしたことでも知らないことがまだまだありそうです。😅

もっと良さげな方法が見つかれば、その都度、備忘録にします。

参考サイト

  1. Jupyter NoteBookとPythonで上位階層のimportをする方法 - nyatla@hatena blog [2019-04-25]
  2. Pythonの相対インポートで上位ディレクトリ・サブディレクトリを指定 | note.nkmk.me
  3. 絶対パスの取得(まとめなおし) #Python - Qiita [2018-09-08]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース