这是我所拥有的:

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'))

但这显然是有限和笨拙的。


当前回答

简化版的Johan Dahlin的回答,没有fnmatch。

import os

matches = []
for root, dirnames, filenames in os.walk('src'):
  matches += [os.path.join(root, f) for f in filenames if f[-2:] == '.c']

其他回答

Johan和Bruno就上述最低要求提供了出色的解决方案。我刚刚发布了Formic,它实现了Ant FileSet和glob,可以处理这种情况和更复杂的场景。您的需求的实现是:

import formic
fileset = formic.FileSet(include="/src/**/*.c")
for file_name in fileset.qualified_files():
    print file_name

类似于其他解决方案,但使用fnmatch。Fnmatch而不是glob,因为os。Walk已经列出了文件名:

import os, fnmatch


def find_files(directory, pattern):
    for root, dirs, files in os.walk(directory):
        for basename in files:
            if fnmatch.fnmatch(basename, pattern):
                filename = os.path.join(root, basename)
                yield filename


for filename in find_files('src', '*.c'):
    print 'Found C source:', filename

此外,使用生成器允许您在找到每个文件时处理它,而不是找到所有文件然后处理它们。

import os, glob

for each in glob.glob('path/**/*.c', recursive=True):
    print(f'Name with path: {each} \nName without path: {os.path.basename(each)}')

Glob.glob ('*.c'):匹配当前目录下所有以.c结尾的文件 Glob.glob ('*/*.c'):与1相同 Glob.glob ('**/*.c'):只匹配直接子目录中以.c结尾的所有文件,不匹配当前目录 glob.glob('*.c',recursive=True):与1相同 glob.glob('*/*.c',recursive=True):与3相同 glob.glob('**/*.c',recursive=True):匹配当前目录和所有子目录中以.c结尾的所有文件

除了建议的答案,你还可以用一些惰性生成和列表理解魔法来做到这一点:

import os, glob, itertools

results = itertools.chain.from_iterable(glob.iglob(os.path.join(root,'*.c'))
                                               for root, dirs, files in os.walk('src'))

for f in results: print(f)

除了适合一行并避免内存中不必要的列表之外,这还有一个很好的副作用,你可以以类似于**操作符的方式使用它,例如,你可以使用os.path。Join (root, 'some/path/*.c')以获取SRC所有子目录下具有此结构的所有。c文件。

简化版的Johan Dahlin的回答,没有fnmatch。

import os

matches = []
for root, dirnames, filenames in os.walk('src'):
  matches += [os.path.join(root, f) for f in filenames if f[-2:] == '.c']