在Python中递归重命名目录

3

我有一个像这样的目录:

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}计划后,整个目录已被更改。即已变为:

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个回答

2

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

我将收集目录和重命名(或打印^^)它们分开处理。但是,如果你运行它,你会发现它从最内层文件夹开始递归地重命名(打印)。
我从Mark Byers这里偷了“replace-last-occurance-in-string” 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(".")

设置 topdown=True 没有起作用。你会建议我如何使用递归来遍历目录? - dunck
嗯,我正在使用 topdown=False 方法进行工作,稍等一下 ;) - Lord_PedantenStein
@discipline 好的,已完成。如果你将“。”重命名为“。”,它会抛出“OSError:[Errno 16]设备或资源忙”,但它完全可以正常工作 ^^-d - Lord_PedantenStein
谢谢,Lord_PedantenStein - 真是太棒了!向你致敬。 - dunck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接