복붙노트

[PYTHON] os.walk의 디렉토리 제외

PYTHON

os.walk의 디렉토리 제외

os.walk ()를 사용하여 디렉토리 트리로 내려가는 스크립트를 작성한 다음 특정 파일 확장자와 일치하는 각 파일을 방문합니다. 그러나 내 도구에서 사용되는 일부 디렉토리 트리에는 하위 디렉토리가 포함되어 있으므로이 스크립트의 목적 상 많은 양의 쓸모가없는 하위 디렉토리가 포함되어 있으므로 사용자가 지정할 수있는 옵션을 추가 할 것으로 생각했습니다. traversal에서 제외 할 디렉토리 목록.

이것은 os.walk ()로 충분히 쉽습니다. 결국, 내가 실제로 os.walk ()가 생성 한 각 파일 / 디렉토리를 방문하거나 건너 뛰고 싶은지 결정하는 것은 나에게 달려있다. 문제는 예를 들어 다음과 같은 디렉토리 트리가있는 경우입니다.

root--
     |
     --- dirA
     |
     --- dirB
     |
     --- uselessStuff --
                       |
                       --- moreJunk
                       |
                       --- yetMoreJunk

쓸모없는 Stuff와 모든 자식을 제외 시키길 원한다면, os.walk ()는 무의미한 하위 디렉토리 (잠재적으로 수천 개의 하위 디렉토리)로 내려갈 것입니다. 말할 필요도없이 많은 것들이 느려집니다. 이상적인 세상에서 나는 os.walk ()에게 더 이상 쓸모없는 아이들을 굴복시키지 말라고 말할 수 있었지만 내 지식으로는 그것을 할 수있는 방법이 없다.

누구나 아이디어가 있습니까? 어쩌면 이런 식으로 제공하는 타사 라이브러리가 있을까요?

해결법

  1. ==============================

    1.현재 위치에서 디렉토리를 수정하면 os.walk에서 방문한 (후속) 파일 및 디렉토리가 제거됩니다.

    현재 위치에서 디렉토리를 수정하면 os.walk에서 방문한 (후속) 파일 및 디렉토리가 제거됩니다.

    # exclude = set([...])
    for root, dirs, files in os.walk(top, topdown=True):
        dirs[:] = [d for d in dirs if d not in exclude]
    

    도움에서 (os.walk) :

  2. ==============================

    2.... O (n ** 2) 대 O (n) 시간의 비용으로 디렉토리를 제외하는 것이므로 주어진 unutbu의 우수한 답을 조금 더 직접적으로 읽습니다.

    ... O (n ** 2) 대 O (n) 시간의 비용으로 디렉토리를 제외하는 것이므로 주어진 unutbu의 우수한 답을 조금 더 직접적으로 읽습니다.

    (올바른 실행을 위해 목록 (dirs)이있는 dirs 목록의 사본을 만들어야합니다)

    # exclude = set([...])
    for root, dirs, files in os.walk(top, topdown=True):
        [dirs.remove(d) for d in list(dirs) if d in exclude]
    
  3. from https://stackoverflow.com/questions/19859840/excluding-directories-in-os-walk by cc-by-sa and MIT license