1. ホーム
  2. python

[解決済み] glob()を使って再帰的にファイルを検索するには?

2022-03-18 16:08:12

質問

これは私が持っているものです。

glob(os.path.join('src','*.c'))

が、srcのサブフォルダを検索したいのです。こんな感じでいいんじゃないでしょうか。

glob(os.path.join('src','*.c'))
glob(os.path.join('src','*','*.c'))
glob(os.path.join('src','*','*','*.c'))
glob(os.path.join('src','*','*','*','*.c'))

しかし、これでは明らかに限界があり、不格好です。

解決方法は?

pathlib.Path.rglob

使用方法 pathlib.Path.rglob から pathlib モジュールは、Python 3.5で導入されました。

from pathlib import Path

for path in Path('src').rglob('*.c'):
    print(path.name)

pathlib を使いたくない場合は、以下のようにします。 glob.glob('**/*.c') を渡すことを忘れないでください。 recursive キーワードパラメータを使用すると、大規模なディレクトリで膨大な時間を消費します。

ドットで始まるファイルにマッチする場合 ( . ) のような、カレントディレクトリにあるファイルや、Unix ベースのシステムでの隠しファイルには os.walk の解決策を以下に示します。

os.walk

古いバージョンのPythonでは os.walk でディレクトリを再帰的に走査し fnmatch.filter という単純な式でマッチングします。

import fnmatch
import os

matches = []
for root, dirnames, filenames in os.walk('src'):
    for filename in fnmatch.filter(filenames, '*.c'):
        matches.append(os.path.join(root, filename))