这是我所拥有的:

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模块中的pathlib. path .rglob,该模块是在Python 3.5中引入的。

from pathlib import Path

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

如果你不想使用pathlib, use可以使用glob.glob('**/*.c'),但不要忘记传入递归关键字参数,这会在大目录上花费过多的时间。

对于以点(.)开头的匹配文件的情况;如当前目录下的文件或基于Unix系统的隐藏文件,请使用操作系统。步行解决方案如下。

os.walk

对于较旧的Python版本,请使用os。递归遍历目录和fnmatch。过滤器匹配一个简单的表达式:

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

其他回答

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

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

从Python 3.4开始,可以在新的pathlib模块中使用Path类之一的glob()方法,它支持**通配符。例如:

from pathlib import Path

for file_path in Path('src').glob('**/*.c'):
    print(file_path) # do whatever you need with these files

更新: 从Python 3.5开始,glob.glob()也支持相同的语法。

import os
import fnmatch


def recursive_glob(treeroot, pattern):
    results = []
    for base, dirs, files in os.walk(treeroot):
        goodfiles = fnmatch.filter(files, pattern)
        results.extend(os.path.join(base, f) for f in goodfiles)
    return results

Fnmatch提供了与glob完全相同的模式,因此这是glob的绝佳替代品。语义非常接近的Glob。迭代版本(例如生成器),替换glob。Iglob是一个简单的改编(只在执行过程中产生中间结果,而不是扩展一个结果列表到最后返回)。

根据其他答案,这是我目前的工作实现,检索根目录中的嵌套XML文件:

files = []
for root, dirnames, filenames in os.walk(myDir):
    files.extend(glob.glob(root + "/*.xml"))

我真的很喜欢python:)

pathlib.Path.rglob

使用pathlib模块中的pathlib. path .rglob,该模块是在Python 3.5中引入的。

from pathlib import Path

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

如果你不想使用pathlib, use可以使用glob.glob('**/*.c'),但不要忘记传入递归关键字参数,这会在大目录上花费过多的时间。

对于以点(.)开头的匹配文件的情况;如当前目录下的文件或基于Unix系统的隐藏文件,请使用操作系统。步行解决方案如下。

os.walk

对于较旧的Python版本,请使用os。递归遍历目录和fnmatch。过滤器匹配一个简单的表达式:

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