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
'ProgramingTip' 카테고리의 다른 글
Android ADT 21.0 경고 : 암시 적으로 기본 로케일 사용 (0) | 2020.12.10 |
---|---|
IIS 7 오류“지정된 세션이 없습니다. (0) | 2020.12.10 |
Git으로 푸시하려는 "remote : fatal error in commit_refs"오류를 어떻게 수정합니까? (0) | 2020.12.10 |
Linter pylint는 설치되지 않습니다. (0) | 2020.12.10 |
OS 독립 경로 'META-INF / proguard / androidx-annotations.pro'가있는 파일이 두 개 이상 발견되었습니다. (0) | 2020.12.10 |