再帰的にファイルを検索するにはどうすればいいですか? 質問する

再帰的にファイルを検索するにはどうすればいいですか? 質問する

ディレクトリ内のすべてのファイルを再帰的にリストしたいと思います。現在、ディレクトリ構造は次のようになっています。

  • src/main.c
  • src/dir/file1.c
  • src/another-dir/file2.c
  • src/another-dir/nested/files/file3.c

私は次のことを実行しようとしました:

from glob import glob

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

ただし、これによって取得されるのはサブフォルダー内のファイルのみですsrc。たとえば、 は取得されますmain.cが、 は取得されませんfile1.cfile2.cなどとなります。

from glob import glob

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

しかし、これは明らかに制限があり、扱いにくいです。どうすればこれを適切に実行できるでしょうか?

ベストアンサー1

いくつかの方法があります:

pathlib.Path().rglob()

使用pathlib.Path().rglob()からpathlibPython 3.5 で導入されたモジュールです。

from pathlib import Path

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

glob.glob()

pathlibを使いたくない場合は、glob.glob():

from glob import glob

for filename in glob('src/**/*.c', recursive=True):
    print(filename)   

.現在のディレクトリ内のファイルや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))

このバージョンは、pathlibモジュールが若干オーバーヘッドを持つため、ファイルの数に応じて高速化されるはずです。os.walk()

おすすめ記事