在Python中递归重命名目录

时间:2016-11-11 21:43:22

标签: python rename

我有一个这样的目录:

enter image description here

我遇到使用此功能的问题:

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))

在到达第二个文件夹时,即{project_name} Planning,整个目录已被更改。即已成为:

enter image description here

因此,似乎for ... in walk(src):停止运行。请注意,循环正常工作;我可以打印每个目录并获得结果:

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

...产量

enter image description here

由于我对Python的了解有限,我认为因为目录已被更改,这会导致walk(src)的异常,并意味着循环被终止。

如何解决此问题以递归遍历目录并重命名包含{project_name}的所有目录?

非常感谢:)

1 个答案:

答案 0 :(得分:1)

Ether检查walk方法的topdown参数以获取迭代方法,或使用递归以递归方式遍历目录树。

编辑:好的我不知道一个优雅的解决方案来重命名字符串的最后一次出现,但是你走了。 ;)

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?。 ^^

更干净,免除异常,可能更难调试奖金版本:

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(".")