2016-11-11 3 views
1

에서이 같은 디렉토리가 있습니다이름 바꾸기 디렉토리의 재귀 파이썬

enter image description here

내가 문제가 발생을하는이 기능을 사용하는 경우 : 즉, 두 번째 폴더에 도달에 {project_name} Planning

from os import walk 
generic_name = "{project_name}" 

def rename_project(src): 
    project_name = raw_input("Name your project: ") 
    for subdir, dirs, files in walk(src): 
     rename(subdir, subdir.replace(generic_name, project_name)) 

을 전체 디렉토리가 변경되었습니다.

enter image description here

을 그리고 같은 for ... in walk(src): 실행을 중단 나타납니다 즉이되고있다. 루프가 올바르게 작동하고 있습니다. 내가 디렉토리 변경 되었기 때문에,이 예외가 발생한다고 가정 파이썬의 내 제한된 지식을 ...

enter image description here

for subdir, dirs, files in walk(src): 
    print subdir 

수율 : 나는 각 디렉토리를 인쇄하고 결과를 얻을 수 있습니다 을 walk(src)으로 바꾸고 루프가 종료되었음을 의미합니다.

재귀 적으로 디렉터리를 반복하고 {project_name}이 포함 된 모든 디렉터리의 이름을 바꾸려면 어떻게해야합니까?

많은 감사합니다 :)

답변

1

에테르는 재귀 적으로 디렉토리 트리를 통과하는 반복적 인 접근 또는 사용 재귀의 도보 방식의 하향식 매개 변수를 확인하십시오.

편집 : 좋아요. 문자열의 마지막 출현 이름을 바꾸는 우아한 솔루션을 모르지만 여기에 나와 있습니다. ;)

import os 
generic_name = "{project_name}" 

subdirs = [] 

def rename_project(src): 
    project_name = raw_input("Name your project: ") 
    for subdir, dirs, files in os.walk(src,topdown=False): 
     subdirs.append(subdir) 

    for subdir in subdirs: 
     newdir = subdir[::-1].replace(generic_name[::-1], project_name[::-1], 1)[::-1] 
     print newdir 
     #os.rename(subdir,newdir) 

rename_project(".") 

나는 dirs를 수집하고 이름을 바꾸는 (또는 인쇄 ^^). 그러나 가장 안쪽 폴더에서 재귀 적으로 이름을 변경 (인쇄)하는 것을 볼 수 있습니다 (실행하면).

그리고 Mark Byers 여기에서 rreplace - How to replace the last occurrence of an expression in a string?의 "replace-last-occurance-in-string"을 훔쳤습니다. ^^

그리고 더 깨끗하고 예외 디버그 보너스 버전으로 어쩌면 더 열심히, 무료 :

import os 
generic_name = "{project_name}" 

def rename_project(src): 
    project_name = raw_input("Name your project: ") 
    for subdir, dirs, files in os.walk(src,topdown=False): 
     newdir = subdir[::-1].replace(generic_name[::-1], project_name[::-1], 1)[::-1] 
     print newdir 
     if newdir != '.': 
      os.rename(subdir,newdir) 

rename_project(".") 
+0

Settting'하향식 = TRUE '는 작동하지 않았다. 당신은 어떻게 재귀를 사용하여 그 dir을 통과 할 것을 제안하겠습니까? – discipline

+0

Hm 그냥 topdown = 틀린 방법으로 작업하고 있습니다.) –

+0

@ discipline OK done. "OSError : [Errno 16] Device or resource busy"라는 이름을 변경하면 "OSError : [Errno 16] Device or resource busy" ~ "." 하지만 완전히 작동합니다 ^^ - d –