🐍 Python

glob() / rglob() でファイルを検索する

glob()は*.txtのようなワイルドカードパターンに一致するパスを検索するメソッドです。指定したディレクトリの直下だけを見るglob()と、サブディレクトリまで再帰的に探すrglob()の2種類があります。

p.glob("*.txt")     # pの直下のみ、*.txtに一致するものを検索
p.rglob("*.py")      # pのサブディレクトリも含めて再帰的に検索
p.glob("**/*.py")    # rglob("*.py")と同じ意味
# 事前にglobtest/にa.txt, b.txt, c.py、globtest/sub/にd.pyがあるとする
from pathlib import Path

globdir = Path("globtest")
txt_files = sorted(p.name for p in globdir.glob("*.txt"))
print(txt_files)
# ['a.txt', 'b.txt']
# glob()は直下のみ(サブディレクトリのd.pyは含まれない)
from pathlib import Path

globdir = Path("globtest")
py_files_shallow = sorted(p.name for p in globdir.glob("*.py"))
print(py_files_shallow)
# ['c.py']
# rglob()はサブディレクトリまで再帰的に検索する
from pathlib import Path

globdir = Path("globtest")
py_files_recursive = sorted(p.name for p in globdir.rglob("*.py"))
print(py_files_recursive)
# ['c.py', 'd.py']
glob()とrglob()の違い
glob(pattern)
指定したディレクトリの直下のみを対象にパターンマッチする
rglob(pattern)
指定したディレクトリ以下を再帰的に(全てのサブディレクトリも含めて)対象にする。glob("**/" + pattern)と同義
💡 AIコードレビュー観点:戻り値はジェネレータで、リストではない

glob()とrglob()はどちらもジェネレータ(イテレータ)を返すため、len(p.glob("*.txt"))のようにいきなり長さを取ろうとするとエラーになります。件数が必要な場合はlist(p.glob("*.txt"))やsum(1 for _ in p.glob("*.txt"))のように一度実体化する必要があります。AIが生成したコードでこのパターンのエラーを見かけたら、戻り値の型を確認しましょう。

← Python pathlib クイックリファレンス一覧へ戻る / iterdirでディレクトリ内を列挙する →