2016-11-09 4 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) 

私は次のコードをより平凡な方法で達成しようとしています。ジェネレータを使用すると、1つのリストの項目に基づいて処理を進めることができます。チェック文字列には別個のリストからの値が含まれています/含まれていません

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

...ただし、2番目の比較は追加できません。私は、単一の追加の基準を持っている以下に管理さが、私は、追加の基準のリストを反復処理する必要があります。

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

どのように私は「きれい」これを達成することができますか?

答えて

1

あなたが最初の場所で除外されているサブツリーに歩いて回避することができます。このソリューションは、

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) 

(あなたが本当に「Criteria2345」という名前のフォルダを除外したいですか?)フォルダの包含と除外を決定するストリングのためのテストが意味するものではないと仮定し、また、元のアプローチよりも堅牢ですただし、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

any呼び出しでand演算子2つの条件を組み合わせる:(... for .. in .. if ..)generator expression、ないlist comrpehensionで、BTW

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

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

または別のandコール(条件と否定)と。

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) 
関連する問題