python的glob函数是否支持具有可变深度的通配符?

时间:2011-07-30 23:50:45

标签: python wildcard glob

我正在编写一个使用这种笨拙的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')

但我不知道适当的超级通配符是什么。这样的事情存在吗?

4 个答案:

答案 0 :(得分:3)

抱歉 - 事实并非如此。您可能需要使用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)

答案 1 :(得分:1)

这不是完美的,但对我有用:

for i in range(max_depth):  
    components= ['./www.dmoz.org/Science/Environment',]+(['*']*i)+['index.html']
    fsearch=os.path.join(*components)
    fs_res=glob.glob(fsearch)
    if len(fs_res)==1:
        return fs_res[0]

答案 2 :(得分:1)

我刚刚发布了Formic,它实现了你需要的通配符 - '**' - 在Apache Ant FileSet and 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 :(得分:1)

我不知道这是否是新的,但是glob现在可以这样做。

例如,

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