Python でディレクトリ配下のファイルを再帰的に取得、表示する方法
2024-07-07
はじめに
Python で pathlib
を使用してディレクトリ配下のファイルを再帰的に取得し、表示する方法を紹介します。
ディレクトリ構成
ディレクトリは以下です。ファイルは txt と log の2種類です。
sample_directory
├── dir1
│ ├── file3.txt
│ └── subdir1
│ └── file4.txt
├── dir2
│ └── subdir2
│ ├── file5.txt
│ └── log2.log
├── file1.txt
├── file2.txt
└── log1.log
スクリプト
結果 1 は、全ての種類のファイルを表示し、結果 2 は、 *.log
ファイルのみ表示します。
from pathlib import Path
base_dir = Path('sample_directory')
print('結果 1: 全てのファイルを表示する')
for file_path in base_dir.rglob('*'):
if file_path.is_file():
print(file_path)
print()
print('結果 2: *.log ファイルのみ表示する')
for file_path in base_dir.rglob('*.log'):
if file_path.is_file():
print(file_path)
# 結果 1: 全てのファイルを表示する
# sample_directory/file2.txt
# sample_directory/file1.txt
# sample_directory/log1.log
# sample_directory/dir1/file3.txt
# sample_directory/dir2/subdir2/file5.txt
# sample_directory/dir2/subdir2/log2.log
# sample_directory/dir1/subdir1/file4.txt
# 結果 2: *.log ファイルのみ表示する
# sample_directory/log1.log
# sample_directory/dir2/subdir2/log2.log
スクリプトの説明
Path('sample_directory')
へ対象のディレクトリを指定しますrglob('*')
で指定されたディレクトリ以下の全てのファイルを再帰的に取得しますis_file()
でファイルか判定し、ファイルの場合は表示します(ディレクトリは表示されない)rglob('*')
は、Path.glob(**/*)
と似たような動作をします
テストファイル作成用スクリプト
上記で利用したテスト用のディレクトリおよびファイルを作成するスクリプトです。
from pathlib import Path
base_dir = Path(base_path)
subdirs = ['dir1', 'dir2', 'dir1/subdir1', 'dir2/subdir2']
files = ['file1.txt', 'file2.txt', 'log1.log', 'dir1/file3.txt',
'dir1/subdir1/file4.txt', 'dir2/subdir2/file5.txt', 'dir2/subdir2/log2.log']
for subdir in subdirs:
(base_dir / subdir).mkdir(parents=True, exist_ok=True)
for file in files:
(base_dir/file).touch()
(base_dir / subdir)
は、pathlib.Path
オブジェクトを使用してディレクトリパスを結合するための構文です。/
演算子はpathlib
モジュールに特有のもので、パスを簡潔に結合するために使用されますmkdir()
でディレクトリを作成しますtouch()
で空のファイルを作成します
参考 URL
- Python docs - Path.rglob