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

다음 코드를 달성하기 위해 노력하고 있지만 좀 더 파이썬적인 방법입니다.체크 문자열에 고유 목록의 값이 포함되거나 포함되지 않음

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) 

어떻게이 '깔끔하게'달성 할 수있다 : 나는 하나의 추가 기준을 가지고 아래에서 관리하지만 추가 기준의 목록을 반복해야합니까?

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

또는 다른 and 호출 (조건 부정) :

답변

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와 결합

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

BTW, (... 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)