📘

Pythonライブラリ「PyProjroot」の紹介

2024/07/16に公開

PyProjrootとは

https://github.com/chendaniely/pyprojroot?tab=readme-ov-file
プロジェクトのルートディレクトリのパスを簡単に取得するためのライブラリです。(Rにあったrprojrootが元らしいです)
以下のようなシンプルなコードで、プロジェクトのルートディレクトリのパスを取得できます。

import pyprojroot

PROJECT_ROOT = pyprojroot.find_root(pyprojroot.has_dir(".git"))

もしくは、hereを使うことでプロジェクトルートからの相対パスを直接取得できます。

from pyprojroot.here import here

DATA_DIR = here("data.csv") # PROJECT_ROOT / "data.csv" と同じ

なにが嬉しいのか

pythonを使ってデータ分析をする際などに、相対パスの扱いが楽になります。
以下のようなシンプルなディレクトリ構造で説明します。

.
└── sample_project/
    ├── data/
    │   ├── data1.csv
    │   └── data2.csv
    └── main.py

この場合はDataFrameは以下のように読み込むことになります。

DATA_DIR = Path("data")
data_frame = pd.read_csv(DATA_DIR / "data1.csv")
cd sample_project
python main.py

しかし、この書き方だとsample_project直下以外から実行した際に相対パスがずれて実行できなくなります。

cd sample_project/data
python ../main.py

FileNotFoundError: [Errno 2] No such file or directory: 'data/data1.csv'

他にも、ファイルが増えてきてsrcディレクトリにまとめたりし始めるとパスがずれます。

.
└── sample_project/
    ├── data/
    │   ├── data1.csv
    │   └── data2.csv
    └── src/
        ├── data1.py
        └── data2.py

ここで、PyProjrootを使用すると実行ディレクトリや実行ファイルの場所を気にすることなく、コードを記述できます。

import pyprojroot
import pandas as pd

PROJECT_ROOT = pyprojroot.find_root(pyprojroot.has_dir(".git"))
DATA_DIR = PROJECT_ROOT / "data"

data_frame = pd.read_csv( DATA_DIR / "data1.csv" ))

プロジェクトルートの基準

特定のファイルやディレクトリがある場所を探して、プロジェクトルートと見做しています。
2024/07/16現在では以下のファイル・ディレクトリをサポートしているようです。

ファイル

  • .here
  • requirements.txt
  • setup.py
  • pyproject.toml
  • *.Rproj

ディレクトリ

  • .git
  • .dvc
  • .spyproject
  • .idea
  • .vscode

まとめ

一番初めにデータの特徴をサクッと見ておきたい、といったシーンで最初に入れておくと非常に便利です。後先考えずにディレクトリを整理しても、ふとした時に別のディレクトリから呼び出しても、問題なく動作するのは想像以上に快適なのでぜひ導入してみてください!

SMARTCAMP Engineer Blog

Discussion