POSIX도 Windows도 하나의 OS 호출에서 모든 데이터를 가져올 수 없습니다. 최소한 POSIX의 경우 디렉토리 당 세 개 (opendir
, readdir
, close
), 디렉토리 항목 당 하나 (stat
)가 추가됩니다.
다음 내용은 게시 한 것보다 적은 OS 호출을 발생시킬 것이라고 생각합니다. 예, os.walk()
전화는 게으르다. 즉, 전체 트리는 walk()
에서 돌아 오면 메모리에 이 아니고이 아니지만 next()
으로 전화하는 동안 조각으로 읽어야합니다.
따라서 제 버전은 1 차 자손 디렉토리에서만 읽을 수 있으며 직접 자식과 손자녀는 stat
이됩니다. 귀하의 버전은 귀하의 디렉토리 구조만큼이나 모든 증손자를 위해 그 일을 할 것입니다.
root='.'
grandChildren = []
for kid in next(os.walk('.'))[1]:
x = next(os.walk(os.path.join('.', kid)))
for grandKid in x[1]: # (or x[1]+x[2] if you care about regular files)
grandChildren.append(os.path.join(x[0], grandKid))
또는 루프 대신의 지능형리스트로 : 함수에 os.walk
의를 고려해 마지막으로
import os
root='.'
grandChildren = [
os.path.join(kid, grandKid)
for kid in next(os.walk(root))[1]
for grandKid in next(os.walk(os.path.join(root, kid)))[1]]
: 테스트에서
def read_subdirs(dir='.'):
import os
return (os.path.join(dir,x) for x in next(os.walk(dir))[1])
root='.'
grandChildren = [
grandKid
for kid in read_subdirs(root)
for grandKid in read_subdirs(kid)]
, 우리는 증조부모가있는 경우 제 버전이
stat
번보다 훨씬 적은 횟수로 걸리는 것을 볼 수 있습니다. 내 홈 디렉토리에서
는, 예를 들어, 나는 각각의 경우에 '.'
에 root
세트 내 코드 (/tmp/a.py
)와 당신 (/tmp/b.py
를) 실행 :
$ strace -e stat python /tmp/a.py 2>&1 > /dev/null | egrep -c stat
1245
$ strace -e stat python /tmp/b.py 2>&1 > /dev/null | egrep -c stat
36049
당신이'unipath' 모듈 봤어 할 수있는뿐만 아니라 모든 파일을 알고? –
[이 답변] (http://stackoverflow.com/a/4117594/8747) 빛을 흘릴 수도 있습니다. –
2 세 이하의 모든 세대의 손주 또는 모든 자손에만 관심이 있으십니까? 즉, '루트/a/b/c/d'가 검색에 포함되거나 제외됩니까? –