2015-09-29 53 views
0

我知道我可以從os.walk使用沿着瀏覽特定迪爾斯過濾器與os.walk

for root, dirs, files in os.walk('/path/to/dir'): 
    ignore = ['dir1', 'dir2'] 
    dirs[:] = [d for d in dirs if d not in ignore] 

我想做的這個相反的東西行刪除迪爾斯,所以只保留列表中的dirs。我嘗試了一些變化,但無濟於事。任何指針將不勝感激。

我很感興趣的是迪爾斯2級了,所以我採取的意見和創建的全局變量子水位和我使用下面的代碼。

預期功能

for root, dirs, files in os.walk(global_subdir): 
keep = ['dir1', 'dir2'] 
dirs[:] = [d for d in dirs if d in keep] 
for filename in files: 
    print os.path.join(root, filename) 
+5

我不是100%確定您要問什麼,但您是否試過將「不在」改爲「在」? – Kevin

+0

是的,我有。我已經更新了我的問題,希望能解釋更好 – iNoob

+0

您是否嘗試過'dirs [:] = [d for d in dirs if d in keep]''?你得到了什麼? –

回答

1

如在刪除答案的評論說 -

前面已經提到,這並不工作。保存中的展品是2層次的根。即時猜測這是造成問題的

的問題是,你上面的要求目錄的一級目錄將不會被遍歷自不在你的名單keep,因此,該程序不會到達,直到你所需的目錄。

來解決,這將是在這僅僅是一個水平之上您所需的目錄的目錄開始os.walk的最佳方式。

但是,如果這是不可能的(如可能的目錄一層所需的一個以上的不穿越之前已知的)或(所需目錄具有不同的目錄中的上一級)。而你真正想要的是避免循環通過不在keep目錄中的目錄的文件。

解決方法是遍歷所有目錄,但只有當位於keep列表(或爲提高性能而設置)時纔會遍歷files。示例 -

keep = set(['required directory1','required directory2']) 
for root, dirs, files in os.walk(global_subdir): 
    if root in keep: 
     for filename in files: 
      print os.path.join(root, filename) 
+0

Anand你能給我任何資源來嘗試理解理解聲明嗎? – iNoob

+0

雖然不是'任何(保留x的x == d)'與保留'd'一樣嗎?由於某種原因,後者不適用於OP。 – Kevin