2011-08-08 124 views

回答

9

警告:這也將選擇的任何位置的圖案匹配的根文件夾,其是節點之下的所有文件/。

import os, fnmatch 

def locate(pattern, root_path): 
    for path, dirs, files in os.walk(os.path.abspath(root_path)): 
     for filename in fnmatch.filter(files, pattern): 
      yield os.path.join(path, filename) 

由於os.walk不接受通配符,我們走樹並過濾我們需要的東西。

js_assets = [js for js in locate('*.js', '/../../nodes')] 

locate函數產生與模式匹配的所有文件的迭代器。

替代解決方案:您可以嘗試extended glob,它將遞歸搜索添加到glob。

現在,您可以編寫一個更簡單的表達:

fnmatch.filter(glob.glob('/../../nodes/*/views/assets/js/**/*'), '*.js') 
+0

的fnmatch.fiilter()不應該與glob2一起使用: glob.glob('/../../ nodes/*/views/as套/ JS/**/*。JS') – miracle2k

1

你爲什麼不拆你的通配路徑劃分爲多個部分,如:

parent_path = glob.glob('/../../nodes/*') 
for p in parent_path: 
    child_paths = glob.glob(os.path.join(p, './views/assets/js/*.js')) 
    for c in child_paths: 
     #do something 

可以更換一些以上列出了您想要檢索的子資產列表。

或者,如果您的環境提供find命令,則可爲此類任務提供更好的支持。如果你在Windows中,可能有類似的程序。