2013-08-06 2 views
2

내 스크립트 중 하나에 필요한 하위 디렉토리의 사양을 자동화하려고합니다. 아이디어는 스크립트가 C : 드라이브에서 특정 이름의 폴더를 검색하도록하는 것입니다. 내 마음에, 이것은 재귀 검색 기능을 요구합니다. 모든 하위 디렉토리를 검사하여 원하는 디렉토리가없는 경우 현재 하위 디렉토리의 하위 디렉토리 검색을 시작합니다.하위 디렉토리 python 검색

이 작업을 수행하는 동안 this question을 찾았으며 목록에 os.walk(dir).next()[1]을 사용하기 시작했습니다. 디렉토리. 이것은 제한된 성공을했습니다. 스크립트는 디렉토리를 통해 검색 할 때 기본적으로 포기하고 휴식을 취하고 StopIteration 오류가 발생합니다. 샘플 출력은 TEST1 내의 하위 디렉토리를 검색하는 것보다 아래에 있습니다.

C:\Python27>test.py 
curDir: C:\Python27 
['DLLs', 'Doc', 'include', 'Lib', 'libs', 'pyinstaller-2.0', 'Scripts', 'tcl', 'TEST1',  'Tools'] 
curDir: DLLs 
[] 
curDir: Doc 
[] 
curDir: include 
[] 
curDir: Lib 
['bsddb', 'compiler', 'ctypes', 'curses', 'distutils', 'email', 'encodings', 'hotshot',  
'idlelib', 'importlib', 'json', 'lib-tk', 'lib2to3', 'logging', 'msilib', 
'multiprocessing', 'pydoc_data', 'site-packages', 'sqlite3', 'test', 'unittest', 'wsgiref', 'xml'] 
curDir: bsddb 
Traceback (most recent call last): 
    File "C:\Python27\test.py", line 24, in <module> 
    if __name__ == "__main__": main() 
    File "C:\Python27\test.py", line 21, in main 
    path = searcher(os.getcwd()) 
    File "C:\Python27\test.py", line 17, in searcher 
    path = searcher(entry) 
    File "C:\Python27\test.py", line 17, in searcher 
    path = searcher(entry) 
    File "C:\Python27\test.py", line 6, in searcher 
    dirList = os.walk(dir).next()[1] 
StopIteration 

curDir가 검색되고있는 현재 디렉토리이며, 출력의 다음 행은 서브 디렉토리의 목록입니다. 프로그램이 하위 디렉토리가없는 디렉토리를 찾으면 한 레벨을 다시 시작하여 다음 디렉토리로 이동합니다.

필요한 경우 내 코드를 제공 할 수 있지만 더 큰 텍스트 월을 피하기 위해 처음에는 게시하지 않으려했습니다.

제 질문은 : 왜 일부 폴더를 검색 한 후 스크립트가 포기합니까? 도와 주셔서 미리 감사드립니다.

답변

3

StopIteration은 반복기에 더 이상 생성 할 값이 없을 때마다 발생합니다.

os.walk(dir).next()[1]을 왜 사용하고 있습니까? for 루프에서 모든 것을하는 것이 더 쉽지 않을까요? 마찬가지로 :

for root, dirs, files in os.walk(mydir): 
    #dirs here should be equivalent to dirList 

여기 os.walk에 대한 설명서입니다. 나를 위해 일한 무엇

+0

예, 훨씬 쉽고 똑똑합니다. 감사! – wnnmaw

+0

@wnnmaw'os.walk'에 대한 문서에 대한 링크를 추가했습니다. 꽤 강력한 명령입니다. – mr2ert

+0

for 루프는 완벽하게 작동하지만 매우 느리게 작동합니다. 600GB 드라이브를 통해 검색하는 데 약 10 분이 소요됩니다. os.walk를 호출하는 더 빠른 방법이 있습니까, 아니면 더 빨리 할 수있는 대체 명령입니까? – wnnmaw

1

아니라 단지 디렉토리 이름보다 os.walk의 전체 경로를 지정하는 것입니다 :

# fullpath of the directory of interest with subfolders to be iterated (Mydir) 
fullpath = os.path.join(os.path.dirname(__file__),'Mydir') 

# iteration 
subfolders = os.walk(fullpath).next()[1] 

이 특히 나에게 무슨 일이 있었 os.walk를 포함하는 모듈이에 위치하는 경우 하위 폴더 자체는 상위 폴더의 스크립트로 가져옵니다.

스크립트에서 os.walk ('Mydir')은 존재하지 않는 Parent/Mydir을 검색합니다.

반면에 os.walk (fullpath)는 Parent/Folder/Mydir에서 찾을 것입니다.