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 ディレクトリにあるファイルの絶対パスが再帰的に表示されました。