はじめに
Python でファイルパスを扱うときに、昔から使われてきたのは os.path。
しかし Python 3 以降では、より直感的で Pythonic な pathlib が標準となりつつあります。
本記事では、pathlib の基本から、
「なぜこれを使うと人生が楽になるのか」までわかりやすくまとめます。
1. pathlib とは?
pathlib は、ファイルパスを「文字列」ではなく「オブジェクト」として扱える標準ライブラリです。
from pathlib import Path
p = Path("data/test.txt")
print(p)
「これはパスですよ」という意味を持つオブジェクトになるため、
os.path のように join や dirname を延々呼ぶ必要がなくなります。
2. パス結合は / 演算子で書ける
os.path.join() の代わりに、/ でパスをつなげられます。
from pathlib import Path
base = Path("data")
path = base / "logs" / "2025" / "access.log"
print(path)
# data/logs/2025/access.log
/ がパス結合としてオーバーロードされているため、
これだけでもコードの可読性が劇的に上がります。
3. パス情報の取得が直感的
よく使う「ファイル名」「拡張子」「親ディレクトリ」などが
属性で取得できるのが pathlib の魅力。
p = Path("data/logs/2025/access.log")
p.name # "access.log"
p.stem # "access"
p.suffix # ".log"
p.parent # "data/logs/2025"
p.parts # ("data", "logs", "2025", "access.log")
文字列操作をほぼ封印できます。
4. ファイル操作:存在判定・作成・削除
存在確認
p = Path("data/test.txt")
p.exists() # True / False
ファイル/ディレクトリ判定
p.is_file()
p.is_dir()
ディレクトリ作成(親ごとOK)
Path("logs/2025/01").mkdir(parents=True, exist_ok=True)
5. 読み書きが超シンプル
Path オブジェクトには、ファイル読み書き用のメソッドが直接備わっています。
読み込み(テキスト)
text = Path("note.txt").read_text(encoding="utf-8")
書き込み(テキスト)
Path("output.txt").write_text("Hello Pathlib!", encoding="utf-8")
バイナリ版
data = Path("bin.dat").read_bytes()
Path("bin.dat").write_bytes(b"\x00\x01\x02")
with open() より短く書けて、ちょっとしたスクリプトには十分便利。
6. ファイル検索:glob / rglob
ワイルドカード付きでファイルを検索できます。
カレントディレクトリの .txt
for p in Path(".").glob("*.txt"):
print(p)
再帰的に検索(サブディレクトリ含む)
for p in Path("logs").rglob("*.log"):
print(p)
ログ整理やバッチ処理にとても便利。
7. 絶対パス・実パスへ変換
p = Path("data/test.txt")
p.resolve() # 絶対パス(シンボリックリンクも解決)
8. os.path との互換性
既存コードが os.path ベースでも大丈夫。
pathlib → str
p = Path("file.txt")
str(p)
str → pathlib
p = Path("/tmp/test.txt")
レガシーコード移行もスムーズです。
9. 実践:ログフォルダを作り、今日の日付のログファイルに書き込む
from pathlib import Path
from datetime import date
base = Path("logs") / "app"
base.mkdir(parents=True, exist_ok=True)
today = date.today().strftime("%Y-%m-%d")
log_file = base / f"{today}.log"
message = "アプリが起動しました\n"
if log_file.exists():
log_file.write_text(
log_file.read_text(encoding="utf-8") + message,
encoding="utf-8"
)
else:
log_file.write_text(message, encoding="utf-8")
pathlib だけで
- パス結合
- ディレクトリ作成
- ファイル存在チェック
- 読み書き
が全部スッキリ書けちゃいます。
10. 実践:kotlinのファイルにヘッダを追加
import pprint
from pathlib import Path
BATCH_INFO= '''// -------------------------------------------------------------------
// Author: Elon
// Date: 2025/03/14
// Description:
// -------------------------------------------------------------------
'''
def prepend_header_to_kt_files(folder_path:str| Path)->None:
base_path =Path(folder_path)
if not base_path.exists():
pprint.pprint(f"[WARN] Can't find folder:{base_path}")
for path in base_path.rglob("*.kt"):
try:
pprint.pprint(f"[INFO] Processing file: {path}")
content= path.read_text(encoding="utf-8")
if content.startswith(BATCH_INFO):
print(" -> Already has header. Skip.")
continue
if content.startswith("{") or content.startswith("//"):
continue
new_content = BATCH_INFO + content
# pprint.pprint(f"Processing file: {path}")
# 必要なら処理後にファイルを書き換える
path.write_text(new_content,encoding="utf-8")
pprint.pprint(f"[INFO] Change content file: {path}")
except Exception as e:
pprint.pprint(f"[ERROR] Error processing {path}: {e}")
if __name__=="__main__":
target_folder= "/Users/elon/Downloads/lib"
prepend_header_to_kt_files(target_folder)
まとめ
pathlib を使うメリットは次の通り:
- パスが “ただの文字列” から “意味を持つオブジェクト” に進化
-
/で直感的にパス結合できる - ファイル名・拡張子取得が属性で簡単
- 読み書きが
read_text/write_textで短縮 -
glob/rglobでファイル探索が簡単 - OS の差異(Windows / Unix)を気にする必要が激減
Python プロジェクトで pathlib を使い始めると、
戻れなくなる快適さ を感じられるはずです。