1. はじめに
Pythonで再帰的にディレクトリとファイル一覧を取得する方法について解説します。
再帰的な検索を使えば、指定したフォルダ内のすべてのサブディレクトリを含めたファイルやフォルダを一覧で取得することができます。大量のファイルを扱うプログラムや、バックアップツール、ファイル管理ツールの開発において非常に便利な機能です。
本記事では、Python初心者〜中級者向けにわかりやすいコード例と実行結果を交えて丁寧に解説していきます。
2. 再帰的にディレクトリとファイル一覧を取得するPythonの基本
2-1. os.walkを使った基本的な方法
Pythonで再帰的にディレクトリを探索する代表的な方法は、os.walk()
を使うことです。
import os
# 再帰的にファイルとディレクトリの一覧を取得する
def list_files_and_dirs(path):
for dirpath, dirnames, filenames in os.walk(path):
print(f"ディレクトリ: {dirpath}")
for filename in filenames:
print(f" ファイル: {filename}")
for dirname in dirnames:
print(f" サブディレクトリ: {dirname}")
# 実行例
list_files_and_dirs("sample_dir")
実行結果:
ディレクトリ: sample_dir
ファイル: file1.txt
サブディレクトリ: subdir
ディレクトリ: sample_dir/subdir
ファイル: file2.txt
os.walk()
は、指定したディレクトリ以下を再帰的に探索し、各ディレクトリでのパス(dirpath)、サブディレクトリ(dirnames)、ファイル名(filenames)を順番に取得してくれます。
2-2. pathlibを使うモダンな方法
Python3.5以降では、pathlib
モジュールを使った記述も人気です。
from pathlib import Path
def list_all_files(path):
p = Path(path)
for item in p.rglob("*"):
if item.is_file():
print(f"ファイル: {item}")
elif item.is_dir():
print(f"ディレクトリ: {item}")
# 実行例
list_all_files("sample_dir")
実行結果:
ファイル: sample_dir/file1.txt
ディレクトリ: sample_dir/subdir
ファイル: sample_dir/subdir/file2.txt
rglob("*")
はすべてのファイル・ディレクトリを再帰的に取得するメソッドです。シンプルで可読性が高いのが特徴です。
3. よくある使い方・応用例
3-1. 特定の拡張子だけを抽出する
例えば、「.txt」ファイルだけを再帰的にリストアップしたい場合は以下のように書けます。
from pathlib import Path
def list_txt_files(path):
p = Path(path)
for file in p.rglob("*.txt"):
print(file)
# 実行例
list_txt_files("sample_dir")
実行結果:
sample_dir/file1.txt
sample_dir/subdir/file2.txt
3-2. ファイル一覧をリストに格納して別処理に使う
取得したファイル一覧をリストとして返すようにしておけば、他の処理(読み込み・削除など)に応用しやすくなります。
from pathlib import Path
def get_all_files(path):
p = Path(path)
return [f for f in p.rglob("*") if f.is_file()]
# リストとして取得
file_list = get_all_files("sample_dir")
for f in file_list:
print(f)
実行結果:
sample_dir/file1.txt
sample_dir/subdir/file2.txt
4. 注意点・エラー対策
4-1. パスの存在確認を忘れない
存在しないディレクトリを指定すると、FileNotFoundError
などのエラーが発生することがあります。
from pathlib import Path
def safe_list_files(path):
p = Path(path)
if not p.exists():
print("指定されたパスが存在しません。")
return
for file in p.rglob("*"):
print(file)
4-2. アクセス権のないディレクトリへの対応
アクセス権限がないフォルダに入ろうとすると、PermissionErrorが出ることがあります。try-exceptで囲んでおくと安全です。
import os
def list_files_safe(path):
for dirpath, dirnames, filenames in os.walk(path):
try:
print(f"ディレクトリ: {dirpath}")
for f in filenames:
print(f" ファイル: {f}")
except PermissionError:
print(f"アクセス拒否: {dirpath}")
5. まとめ
今回はPythonで再帰的にディレクトリとファイル一覧を取得する方法を解説しました。
os.walk()
でディレクトリ・ファイルの探索ができるpathlib.Path().rglob()
でより直感的なコードも書ける- 特定の拡張子だけ取得したり、リストに格納して活用できる
- 存在確認や例外処理を加えることでエラーに強いコードになる
実務でも「ログファイルの一括チェック」「画像ファイルの収集」「バッチ処理の対象取得」など、活用シーンは豊富です。
Python学習のコツとしては、「まずは基本形を動かしてみる → 自分の環境に応じた応用を加える」という流れが理解を深める近道になります。
ぜひ実際に手を動かして試してみてください。