2014-10-20 3 views
0

저는 파이썬 (강력한 C# 배경)을 사용하는 데있어 매우 익숙하므로 함수에서 기대하는 결과를 여전히 배우고 있습니다. 디렉토리 구조를 빌려줄 재귀 함수를 만드는 이상한 결과를 얻고 있습니다. os.walk() 함수를 사용하고 있는데 일단 빈 공간을 찾으면 '디렉토리'에 대한 반환 결과가 지워지지 않는 것 같습니다. 나는 "여기os.walk()를 사용하여 파이썬에서 재귀 문제가 발생했습니다.

def CheckSubFolder(folder): 

    print "Checking folders in : " + folder; 

    for (root, directories, files) in os.walk(folder): 
     for folder2 in directories: 
      print folder2; 

     for folder2 in directories: 
      CheckSubFolder(folder + "\\" + folder2); 

    return; 

# Code Entry 
InFolder = sys.argv[1]; 
CheckSubFolder(InFolder); 
sys.exit(); 

2.7 내가 사용 예제 디렉토리 구조 내 IDE 파이썬으로 Eclipse를 사용하고 있습니다 여기에

State 
    -> 1 
     -> 2 
     -> 3 
      -> 4 
      -> 5 
       -> 6 
       -> 7 

내가되고 반환있어 결과를 다음과 같습니다.

Checking folders in : \\State 
1 
Checking folders in : \\State\1 
2 
3 
Checking folders in : \\State\1\2 
Checking folders in : \\State\1\3 
4 
5 
Checking folders in : \\State\1\3\4 
Checking folders in : \\State\1\3\5 
6 
7 
Checking folders in : \\State\1\3\5\6 
Checking folders in : \\State\1\3\5\7 
6 
7 
Checking folders in : \\State\1\3\6 
Checking folders in : \\State\1\3\7 
4 
5 
Checking folders in : \\State\1\4 
Checking folders in : \\State\1\5 
6 
7 
Checking folders in : \\State\1\6 
Checking folders in : \\State\1\7 
+0

'os.walk' 사용자를 재귀 적으로 시도 할 필요가 없습니다. 이미 전체 디렉토리 구조를 살펴 둡니다. – sberry

답변

3

os.walk 자체는 재귀 적으로 작동 재귀 적으로 호출하지 마십시오.

def CheckSubFolder(folder): 
    for root, directories, files in os.walk(folder): 
     for d in directories: 
      print "folder : " os.path.join(root, d) 
     for f in files: 
      print "file : " os.path.join(root, f) 

# Code Entry 
path = sys.argv[1] 
CheckSubFolder(path) 
+0

이렇게 잘 작동하는 것 같습니다. 내가 원했던만큼 내가 그걸 통제 할 수 없을 것 같아. 폴더 경로 문자열의 목록 일뿐입니다. 나는 당신이 재귀와 함께 얻는 폴더에 뛰어 드는 느낌을 더 선호 할 것이다. 이것은해야 할 것입니다, 환호. – megabytes

+1

@ 메가 바이트 : 수동으로 디렉토리를 검색하려면 대신에'os.listdir()'을 사용하십시오. 그런 다음 디렉토리 구조를 탐색하는 방법을 결정할 수 있습니다. –

+1

@ 메가 바이트 :'print' 대신에'yield'를 사용하면'os.walk()'는 파일 이름을 선택하는 코드와 선택된 이름을 처리하는 코드를 깔끔하게 분리 할 수 ​​있습니다 :'for name in generate_names (topdir) : ... '파일, 명령 줄 등에서 이름을 얻을 수 있습니다. 처리 코드가 변경되지는 않습니다. – jfs

관련 문제