pathlib モジュールの Path.glob() を使うと、ディレクトリ内のファイルを再帰的に抽出することができます。
抽出するファイルは特定の拡張子に限定することも可能です。その際、複数の拡張子を指定したいときには少し工夫が必要なので書いておきたいと思います。
1. 拡張子が異なるファイルの抽出
最も汎用性が高く、どんなパターンでも使える方法から説明していきます。任意の異なる拡張子を指定して抽出します。
例として .py または .txt の拡張子を持つファイルをリストに抽出してみます。
from pathlib import Path
_dir = 'C:/TestDirectory' # 対象のディレクトリ
_extension = ['.py', '.txt'] # 抽出する拡張子
_files = [i for i in Path(_dir).glob('**/*.*') if i.suffix in _extension]
glob(‘**/*.*’) で、ディレクトリ内のファイルを再帰的に走査します。i.suffix で拡張子を取得できますので、それが条件に当てはまるものだけをリストにしています。
リスト内の要素はパスオブジェクトです。もし文字列として取得したい場合は、_files を以下のようにします。
_files = [i.as_posix() for i in Path(_dir).glob('**/*.*') if i.suffix in _extension]
2. 拡張子の一部が同一で、かつ長さが等しいファイルの抽出
.pyc と .pyw とのように、拡張子の一部が同じで、かつ長さが等しいファイルの場合です。[] 内に異なる部分の文字を入れることで簡潔に記述できます。
from pathlib import Path
_dir = 'C:/TestDirectory' # 対象のディレクトリ
_files = [i for i in Path(_dir).glob('**/*.py[cw]')]
[cw] は、c または w のいずれかの文字を意味します。任意の一文字を指定したいときは「?」を使って .py? と書いても良いです。
[] を利用すると、長さが同じ拡張子であれば全く異なるものを指定することも可能です。例として .txt と .bak を抽出してみます。
_files = [i for i in Path(_dir).glob('**/*.[tb][xa][tk]')]
ただし、この方法はコードを読んだときに拡張子が非常にわかりづらいので、あまり多用はしない方が良いかもしれません。
3. 拡張子の一部が同一で、長さが異なるファイルの抽出
.py と .pyw とのように、拡張子の一部が同じで、長さが異なるファイルの場合です。
from pathlib import Path
_dir = 'C:/TestDirectory' # 対象のディレクトリ
_extension = ['.py', '.pyw'] # 抽出する拡張子
_files = [i for i in Path(_dir).glob('**/*.py*') if i.suffix in _extension]
glob(‘**/*.py*’) とすることで、拡張子に「.py」が含まれるファイルだけを抽出しています。こうしたコスト削減に意味があるかどうかはともかく、長さが異なることで [] や ? を使った指定ができないので、方法だけお示ししてみました。