haihai Blog

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