2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】pathlib 入門:もう os.path には戻れない

2
Last updated at Posted at 2025-11-17

はじめに

Python でファイルパスを扱うときに、昔から使われてきたのは os.path
しかし Python 3 以降では、より直感的で Pythonic な pathlib が標準となりつつあります。

本記事では、pathlib の基本から、
「なぜこれを使うと人生が楽になるのか」までわかりやすくまとめます。


1. pathlib とは?

pathlib は、ファイルパスを「文字列」ではなく「オブジェクト」として扱える標準ライブラリです。

from pathlib import Path

p = Path("data/test.txt")
print(p)

「これはパスですよ」という意味を持つオブジェクトになるため、
os.path のように joindirname を延々呼ぶ必要がなくなります。


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 を使い始めると、
戻れなくなる快適さ を感じられるはずです。

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?