ProgramingTip

os.walk는 어떤 순서로 반복을 반복을 반복합니까?

bestdevel 2020. 12. 10. 20:56
반응형

os.walk는 어떤 순서로 반복을 반복을 반복합니까?


에서 제공하는 파일 및 디렉토리의 순서가 걱정 os.walk()됩니다. 나는 이러한 디렉토리가있는 경우, 1, 10, 11, 12, 2, 20, 21, 22, 3, 30, 31, 32, 출력 목록의 순서는 무엇인가?

숫자 값으로 어디에 있습니까?

1 2 3 10 20 30 11 21 31 12 22 32

또는 다음과 같이 ASCII 값으로 정렬됩니다. ls?

1 10 11 12 2 20 21 22 3 30 31 32

또한 특정 지역에서 어디에서 어떻게해야합니까?


os.walk를 사용합니다 os.listdir. 다음은에 대한 독독입니다 os.listdir.

listdir (경로)-> list_of_strings

디렉토리의 항목 이름이 포함 된 목록을 반환합니다.

path: path of directory to list

목록은 임의의 순서로되어 있습니다. 특수 항목 '.'은 및 '..'이 디렉토리에있는 경우에도 마찬가지입니다.

(내 강조).

그러나 sort원하는 순서를 보장하는 데 사용할 수 있습니다.

for root, dirs, files in os.walk(path):
   for dirname in sorted(dirs):
        print(dirname)

(디렉터리 이름은 정수가 아닌 sorted(dirs)패키지로 정렬합니다.

에 AlFe와 치로 틸리 지적했듯이 디렉토리가를 정렬 된 순서 되풀이 하려면 dirs 현재 위치에서 수정하십시오 .

for root, dirs, files in os.walk(path):
   dirs.sort()
   for dirname in dirs:
        print(os.path.join(root, dirname))

직접 테스트 할 수 있습니다.

import os

os.chdir('/tmp/tmp')
for dirname in '1 10 11 12 2 20 21 22 3 30 31 32'.split():
     try:
          os.makedirs(dirname)
     except OSError: pass


for root, dirs, files in os.walk('.'):
   for dirname in sorted(dirs):
        print(dirname)

인쇄물

1
10
11
12
2
20
21
22
3
30
31
32

숫자 순서로 광고 비용 다음을 사용하십시오.

for dirname in sorted(dirs, key=int):

영숫자 문자열을 정렬하려면 자연 종류를 사용하십시오 .


os.walk()각 단계에서 다음 단계에서 수행 할 작업을 산출합니다. 각 단계에서 원하는 방식으로 목록을 정렬하여 다음 단계의 순서에 영향을 줄 수 있습니다. 2.7 매뉴얼 인용 :

topdown이 True이면 호출자는 dirnames 목록을 제자리에서 수정할 수 있으며 (아마도 del 또는 slice 할당을 사용하여) walk ()는 이름이 dirnames에 남아있는 하위 디렉터리로만 재귀합니다. 검색을 정리하고 특정 방문 순서를 부과하는 데 사용할 수 있습니다.

따라서를 정렬하면 dirNames방문하는 순서에 영향을 미칩니다.

for rootName, dirNames, fileNames in os.walk(path):
  dirNames.sort()  # you may want to use the args cmp, key and reverse here

그 후 dirNames는 제자리에서 정렬되고 다음으로 산출 된 값 walk이 그에 따라 정렬 됩니다.

물론 목록을 정렬 할 수도 fileNames있지만 추가 단계에는 영향을주지 않습니다 (파일에 하위 항목 walk없기 때문에 방문 할 것임).

물론 unutbu의 답변이 제안한대로 이러한 목록의 정렬 된 버전을 반복 할 수 있지만 그 walk자체 의 추가 진행에는 영향을주지 않습니다 .

값의 수정되지 않은 순서는에 의해 정의되지 않습니다 os.walk. 즉, "모든"순서가됩니다. 오늘날 경험하는 것에 의존해서는 안됩니다. 그러나 사실 그것은 아마도 기본 파일 시스템이 반환하는 것일 것입니다. 일부 파일 시스템에서는 알파벳순으로 정렬됩니다.


가장 간단한 방법은 다음을 os.walk()사용하여 의 반환 값을 정렬하는 것입니다 .

for rootName, dirNames, fileNames in sorted(os.walk(path)):
    #root, dirs and files are iterated in order... 

참고 URL : https://stackoverflow.com/questions/18282370/in-what-order-does-os-walk-iterates-iterate

반응형