2016-11-09 65 views
2
listIncludedFolders = ["Criteria1"] 
listExcludedFolders = ["Criteria2"] 

for dirpath, dirnames, filenames in os.walk(root): 

    proceed = False 

    for each in listIncludedFolders: 
     if each in dirpath: 
      proceed = True 

    if proceed == True: 
     for each in listExcludedFolders: 
      if each in dirpath: 
       proceed = False 

    if proceed == True: 
     print(dirpath) 

我試圖實現下面的代碼,但以更pythonic的方式。使用發電機我可以設法繼續基於單個列表的項目:檢查字符串包括/不包括來自不同清單的值

if any(dir in dirpath for dir in listIncludedFolders): 
    print(dirpath) 

...但我不能添加第二個比較。我在下面的管理有一個附加的標準,但我需要遍歷的附加標準的列表:

if any(dir in dirpath for dir in listIncludedFolders if("Criteria2" not in dirpath)): 
    print(dirpath) 

我怎樣才能做到這一點「乾淨」?

回答

1

你能避免走進被排除在首位子樹。該解決方案也比原來的做法更穩健,假設測試子來確定包容和文件夾排除並非是什麼意思(你真的要排除名爲「Criteria2345」的文件夾?)

for dirpath, dirnames, filenames in os.walk(root): 
    if set(dirpath.split(os.path.sep)) & set(listIncludedFolders): 
     print(dirpath) 
    for ex in [dnam for dnam in dirnames if dnam in listExcludedFolders]: 
     dirnames.remove(ex) 

但請注意,如果root位於排除列表中,則在此實施中將被忽略。

+0

我不確定我是否按照您的建議。我看到的結果是使用os.walk排除的目錄沒有被輸入。我也明白,os.path.walk已被棄用,應該避免。我當然不想浪費時間在目錄中...... – user3535074

+0

嘿謝謝'os.path.walk'已被棄用的暗示。我相信你上面的代碼也會進入排除目錄。原來你也可以用os.walk來避免這種情況。我相應地編輯了答案。 – hvwaldow

+0

謝謝 - 我試過你的代碼。它的運行速度比我發佈的答案快很多,但它也發現了更多的文件夾,而不是我發佈的答案中找到的文件夾。也許是因爲「if set(dirpath.split(os.path.sep))&set(listIncludedFolders):」這行。你能解釋一下這條線嗎?我不確定它在做什麼。 – user3535074

2

組合兩個條件與and操作者與另一any呼叫:

if any(each in dirpath for each in listIncludedFolders) and \ 
     not any(each in dirpath for each in listExcludedFolders): 
    print(dirpath) 

或與另一and呼叫(與條件否定):

if any(each in dirpath for each in listIncludedFolders) and \ 
     all(each not in dirpath for each in listExcludedFolders): 
    print(dirpath) 

順便說一句,(... for .. in .. if ..)generator expression,而不是一個list comrpehension

0

這個完美的作品:

listIncludedFolders = ["Criteria1"] 
listExcludedFolders = ["Criteria2"] 

for dirpath, dirnames, filenames in os.walk(root): 

    if any(each in dirpath for each in listIncludedFolders) and \ 
      not any(each in dirpath for each in listExcludedFolders): 
     print(dirpath)