programing

OS.walk의 디렉터리 제외

css3 2023. 7. 9. 12:35

OS.walk의 디렉터리 제외

저는 (os.walk()를 사용하여) 디렉토리 트리로 내려간 다음 특정 파일 확장자와 일치하는 각 파일을 방문하는 스크립트를 작성하고 있습니다.그러나 내 도구가 사용될 디렉터리 트리 중 일부에는 쓸모없는 항목(이 스크립트의 목적으로)이 많이 포함된 하위 디렉터리도 포함되어 있기 때문에 사용자가 순회에서 제외할 디렉터리 목록을 지정할 수 있는 옵션을 추가해야 한다고 생각했습니다.

os.walk()를 사용하면 충분히 쉽습니다.결국 os.walk()에서 제공하는 각 파일/dirs를 실제로 방문할지 아니면 그냥 건너뛸지 결정하는 것은 저에게 달려 있습니다.문제는 예를 들어 다음과 같은 디렉터리 트리가 있다는 것입니다.

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

그리고 나는 쓸모없는 Stuff와 그것의 모든 아이들, os.walk()는 여전히 쓸모없는 Stuff의 모든 (잠재적으로 수천 개의) 하위 디렉터리로 내려올 것이며, 말할 필요도 없이, 이것은 일의 속도를 크게 늦출 것입니다.이상적인 세상에서, 저는 os.walk()에게 쓸모없는 Stuff의 아이들을 더 이상 양보하지 말라고 말할 수 있었지만, 제가 알기로는 그럴 방법이 없습니다(없습니까?).

아이디어 있는 사람?혹시 그런 것을 제공하는 제3자 도서관이 있을까요?

수정dirs in-place는 방문한 (독립적인) 파일 및 디렉토리를 제거합니다.os.walk:

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

도움말(os.walk)에서:

topdown이 true이면 호출자는 dirnames 목록을 in-place로 수정할 수 있으며(예: del 또는 slice 할당을 통해), walk는 dirnames에 이름이 남아 있는 하위 디렉토리에만 반복됩니다. 이는 검색을 정리하는 데 사용할 수 있습니다.

O(n**2) 대 O(n) 시간을 희생하여 디렉터리를 제외하려는 의도를 고려할 때, @unutbu의 우수한 답변의 다른 형태는 조금 더 직접적으로 읽힙니다.

(Dirs 목록의 복사본 만들기)list(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]

언급URL : https://stackoverflow.com/questions/19859840/excluding-directories-in-os-walk