os.walk ()를 사용하여 디렉토리 트리로 내려간 스크립트를 작성하고 특정 파일 확장자와 일치하는 각 파일을 방문합니다. 하지만, 내 도구는 차례로 포함하는 서브 디렉토리 포함에 사용됩니다 디렉토리 나무의 일부 이후 LOT 물건 (이 스크립트의 목적을 위해) 쓸모없는의를, I는 사용자가 지정하는 내가 옵션을 추가 거라고 생각 순회에서 제외 할 디렉토리 목록
이것은 os.walk ()로 충분합니다. 결국, os.walk ()에 의해 생성 된 각각의 파일 / 디렉토리를 실제로 방문할지 아니면 그냥 건너 뛸지를 결정하는 것은 나에게 달려 있습니다. 문제는 예를 들어 다음과 같은 디렉토리 트리가있는 경우입니다.
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
그리고 나는 uselessStuff 와 그 모든 자식 을 제외하고 싶습니다 . os.walk ()는 uselessStuff의 모든 (잠재적으로 수천 개의) 하위 디렉토리로 내려갈 것입니다. 이상적인 세계에서 os.walk ()에게 더 이상 쓸모없는 Stuff의 자식을 생성하는 것을 귀찮게 하지는 않지만 내 지식에는 그렇게 할 수있는 방법이 없습니다 (있는가?).
누구든지 아이디어가 있습니까? 어쩌면 그런 것을 제공하는 타사 라이브러리가 있습니까?
답변
내부 수정 dirs
은 다음에 방문한 (후속) 파일 및 디렉토리를 제거합니다 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)에서 :
하향식이 true이면 호출자는 디렉토리 이름 목록을 제자리에서 수정할 수 있으며 (예 : 델 또는 슬라이스 지정을 통해), 디렉토리 이름에 디렉토리 이름이 남아있는 서브 디렉토리로만 이동합니다. 이것은 검색을 제거하는 데 사용할 수 있습니다 …
답변
… O (n ** 2) 대 O (n) 시간의 비용으로 디렉토리 를 제외 하려는 의도를 감안할 때 @unutbu의 훌륭한 답변의 대안 양식을 조금 더 직접 읽습니다 .
( list(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]