🐍 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が生成したコードでこのパターンのエラーを見かけたら、戻り値の型を確認しましょう。