Python的glob函数支持可变深度通配符吗?

7 投票
5 回答
3442 浏览
提问于 2025-04-16 22:35

我正在写一个使用这种奇怪的 glob 语法的 Python 脚本。

import glob    
F = glob.glob('./www.dmoz.org/Science/Environment/index.html')
F += glob.glob('./www.dmoz.org/Science/Environment/*/index.html')
F += glob.glob('./www.dmoz.org/Science/Environment/*/*/index.html')
F += glob.glob('./www.dmoz.org/Science/Environment/*/*/*/index.html')
F += glob.glob('./www.dmoz.org/Science/Environment/*/*/*/*/index.html')

看起来应该有办法把这个写成一行:

F = glob.glob('./www.dmoz.org/Science/Environment/[super_wildcard]/index.html')

但是我不知道合适的超级通配符是什么。有没有这样的东西呢?

5 个回答

2

我刚刚发布了一个叫做 Formic 的工具,它实现了你需要的通配符 - '**' - 这个功能是基于 Apache Ant 的 FileSet 和 Globs

你可以这样来进行搜索:

import formic
fileset = formic.FileSet(include="/www.dmoz.org/Science/Environment/**/index.html")
for file_name in fileset.qualified_files():
    # Do something with file_name

这个搜索会从当前目录开始。我希望这对你有帮助。

3

我不知道这是不是新功能,但现在 glob 可以做到这一点。

比如说,

F = glob.glob('./www.dmoz.org/Science/Environment/**/index.html', recursive=True)
4

抱歉,不能这样做。你可能需要写几行代码,使用 os.walk 这个工具:

for root, dirs, files in os.walk('/starting/path/'):
    for myFile in files:
        if myFile == "index.html":
            print os.path.join(root, myFile)

撰写回答