Поддерживает ли функция glob в python подстановочные знаки с переменной глубиной? - PullRequest
3 голосов
/ 31 июля 2011

Я пишу скрипт на python, который использует этот неуклюжий синтаксис glob.

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

Но я не знаю, каким будет соответствующий супер-символ. Существует ли такая вещь?

Ответы [ 3 ]

3 голосов
/ 31 июля 2011

Извините - это не так.Вам, вероятно, придется написать несколько строк кода, используя 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 голос
/ 15 мая 2012

Я только что выпустил Formic , который реализует именно тот подстановочный знак, который вам нужен - '**' - в реализации Apache Ant's 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

Это будет искать из текущего каталога. Надеюсь, это поможет.

1 голос
/ 09 ноября 2011

Это не идеально, но у меня работает:

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]
...