ディレクトリ内のすべてのファイルを再帰的にリストしたいと思います。現在、ディレクトリ構造は次のようになっています。
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.c
、file2.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()
からpathlib
Python 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()
。