这是我所拥有的:

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.rglob()。

这就像调用Path.glob(),在给定的相对模式前添加“**/”:

import pathlib


for p in pathlib.Path("src").rglob("*.c"):
    print(p)

也可以在这里看到@taleinat的相关帖子和其他地方的类似帖子。

其他回答

类似于其他解决方案,但使用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

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

下面是一个带有嵌套列表推导式的解决方案,os。Walk和简单的后缀匹配代替glob:

import os
cfiles = [os.path.join(root, filename)
          for root, dirnames, filenames in os.walk('src')
          for filename in filenames if filename.endswith('.c')]

它可以被压缩成一行代码:

import os;cfiles=[os.path.join(r,f) for r,d,fs in os.walk('src') for f in fs if f.endswith('.c')]

或概括为函数:

import os

def recursive_glob(rootdir='.', suffix=''):
    return [os.path.join(looproot, filename)
            for looproot, _, filenames in os.walk(rootdir)
            for filename in filenames if filename.endswith(suffix)]

cfiles = recursive_glob('src', '.c')

如果您确实需要完整的glob样式模式,您可以遵循Alex的和 Bruno的例子,使用fnmatch:

import fnmatch
import os

def recursive_glob(rootdir='.', pattern='*'):
    return [os.path.join(looproot, filename)
            for looproot, _, filenames in os.walk(rootdir)
            for filename in filenames
            if fnmatch.fnmatch(filename, pattern)]

cfiles = recursive_glob('src', '*.c')

我需要一个python 2的解决方案。在大目录上快速工作的X。 我得出了这个结论:

import subprocess
foundfiles= subprocess.check_output("ls src/*.c src/**/*.c", shell=True)
for foundfile in foundfiles.splitlines():
    print foundfile

注意,您可能需要一些异常处理,以防ls找不到任何匹配的文件。

考虑pathlib.rglob()。

这就像调用Path.glob(),在给定的相对模式前添加“**/”:

import pathlib


for p in pathlib.Path("src").rglob("*.c"):
    print(p)

也可以在这里看到@taleinat的相关帖子和其他地方的类似帖子。

你需要使用操作系统。行走以收集符合条件的文件名。例如:

import os
cfiles = []
for root, dirs, files in os.walk('src'):
  for file in files:
    if file.endswith('.c'):
      cfiles.append(os.path.join(root, file))