pathlibを始める — オブジェクト指向のパス処理

Pythonを使っていると、ファイルパスやディレクトリを扱うことは非常に一般的です。ログを保存したり、設定ファイルを読み書きしたり、データファイルを整理したりするなど、日常的な作業です。これらの作業は、以前は os.pathglobshutil などのモジュールを混ぜて使って処理していましたが、もうその必要はありません。なぜでしょうか?

pathlib があるからです。

pathlibとは何か?

pathlib は Python 3.4 から登場した パス処理専用のオブジェクト指向モジュール です。従来はファイルパスを単なる文字列として扱っていましたが、 pathlib は「パスそのもの」を一つのオブジェクトとして扱います。そのおかげで、パスを結合したり、存在を確認したり、ファイルを読み書きする作業がはるかに 明確で読みやすい文法 へと変わりました。

from pathlib import Path

▶ この Path クラスは、自動的にあなたのオペレーティングシステムに合わせて PosixPath(macOS/Linux)または WindowsPath として動作します。あなたがどのOSを使っていても心配する必要はありません!


pathlibの必須機能と例

1. パスオブジェクトの生成

p = Path('data/example.txt')
print(p.resolve())  # 絶対パスを返す

文字列のように見えますが、これはオブジェクトです。さまざまなメソッドと属性を使って、パスを柔軟に扱うことができます。

2. パスの結合: / 演算子の使用

data_dir = Path('data')
file_path = data_dir / 'sample.txt'

スラッシュ演算子 / でパスを結合できるのは非常にPythonicです。文字列の足し算よりも可読性と安定性が高いです。

3. パス情報の抽出

親ディレクトリ、名前、拡張子など、パスの構成要素を分離できるのも非常に便利です。

p = Path('data/sample.txt')
print(p.parent)   # data
print(p.name)     # sample.txt
print(p.stem)     # sample
print(p.suffix)   # .txt

4. 存在確認

結果をブーリアンで返します。

p.exists()     # 存在確認
p.is_file()    # ファイルか?
p.is_dir()     # ディレクトリか?

5. ディレクトリの作成

p = Path('logs/2025/05')
p.mkdir(parents=True, exist_ok=True)

ネストされたディレクトリも一度に作成でき、既に存在していてもエラーなしで処理されます。

6. ファイルの読み書き

p = Path('output.txt')
p.write_text("こんにちは、世界!")

text = p.read_text()
print(text)

バイナリファイルも扱えます:

p.write_bytes(b'binary data')
data = p.read_bytes()

7. ファイル/ディレクトリ検索

print(list(Path('.').glob('*.py')))      # 現在のフォルダの .py ファイルリスト
print(list(Path('.').rglob('*.py')))     # サブフォルダまで再帰探索

glob() はジェネレーターを返すため、リストに変換して確認するのが良いでしょう。

8. ファイルの削除、移動、名前変更

p.unlink()           # 削除
p.rename('newname')  # 名前変更(同じディレクトリ内で)
p.replace('newpath') # 移動および上書き

rename() は対象パスが存在する場合失敗することがあるので、上書きが必要な場合は replace()を使用してください。コピー作業には shutil.copy() を使う必要があります。


os.path vs pathlibの比較

# os.path
import os
os.path.exists('foo/bar.txt')

# pathlib
Path('foo/bar.txt').exists()
  • コードがずっと読みやすくなり、可読性も向上しました。
  • 特にLinux環境でよく使われる cdlsmkdir に似た文法構造で親しみやすいです。

なぜpathlibを使うべきか?

  • 文字列の代わりに Pathオブジェクトを使うことで構造的なコードが実現します。
  • オペレーティングシステムに依存しないパス処理(Windows vs POSIX)
  • os.pathglobshutil の機能を一つに統合
  • テストコード、ロギング、エラーハンドリングなどでも メンテナンス性の向上

TuxがPythonのTシャツを着てファイルパスブロックを組み立てている

まとめ

Counterdefaultdict がコレクションを扱うのをよりエレガントにするように、 pathlib はファイルパスを扱う方法を完全に変えます。文字列処理に苦労していた昔の時代は、もう忘れても構いません。この文章で示した例を一つ一つ実行してみてください。思ったよりも早く慣れることでしょう。

次回は shutil を使って実際のファイルのコピー/バックアップを自動化する高度な活用法を取り扱う予定です。期待してください!

前の記事が気になる方は、下のリンクをクリックして確認できます。

Python標準ライブラリ 1 - collections.Counter 

 Python標準ライブラリ 2 - collections.defaultdict