環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Pythonでファイルのパスを再帰的に取得する:Path.rglobとPath.is_fileを使う

最終更新日 2022.11.20

今回は Python のファイル・パスを再帰的に取得します。下はプロジェクトの全体像で、root にあるファイルの取得が目標です。

root ディレクトリにあるファイル一覧は os.listdir で表示します。もちろんこれは再帰的ではありません。

import os

files = os.listdir('./root')

print(files)  # ['app', 'e.py', 'd.py']

app にあるファイルを取得するにはどうすればいいでしょうか? まずは結論から。

from pathlib import Path

for f in Path('./root').rglob('*'):
    print(f)

# root/app
# root/e.py
# root/d.py
# root/app/index.py
# root/app/database.py
# root/app/templates
# root/app/templates/header.html

os よりも便利な pathlib から Path をインポートします。Path に調べたいディレクトリのパスを入れると、上のようにすべてのファイルとディレクトリを取得できます。

ファイルのみを表示したいときは Path.is_file をさしこむといいでしょう。

from pathlib import Path

for f in Path('./root').rglob('*'):
    if Path.is_file(f):
        print(f)

# root/e.py
# root/d.py
# root/app/index.py
# root/app/database.py
# root/app/templates/header.html

root ディレクトリにあるファイルが再帰的に表示されました。これらは相対パスですが、絶対パスにするには Path.absolute を使います。

from pathlib import Path

for f in Path('./root').rglob('*'):
    if Path.is_file(f):
        print(Path.absolute(f))

# /Users/serif/python/test/root/e.py
# /Users/serif/python/test/root/d.py
# /Users/serif/python/test/root/app/index.py
# /Users/serif/python/test/root/app/database.py
# /Users/serif/python/test/root/app/templates/header.html

これでようやく root ディレクトリにあるファイルの絶対パスが再帰的に表示されました。