2011-07-30 8 views
3

私はこの厄介なグロブ構文を使用するpythonスクリプトを書いています。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') 

これは1行でラップする方法があるはずはずのように思える:

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

しかし、私は適切なスーパーワイルドカードがどうなるか分かりません。そんなことがあるの?

答えて

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

それは完璧ではないですが、私の作品:

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

これは、現在のディレクトリから検索します。私はこれが役立つことを願っています

+0

ミックスに含まれると除外されるとき、私は実際にアリワイルドカードプロセスに欠陥があることを発見します。たとえば、antワイルドカードを使用してこのフィルタを表現することはできません。「dir a/b/cにすべてのファイルを含めるが、readme.txtを除くすべての* .txtファイルは除外したい。 PERFORCEの実装は、パターンの順序を使用して機能させるので、はるかに優れています。 –

関連する問題