我有一个这样的目录:
我遇到使用此功能的问题:
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
,整个目录已被更改。即已成为:
因此,似乎for ... in walk(src):
停止运行。请注意,循环正常工作;我可以打印每个目录并获得结果:
for subdir, dirs, files in walk(src):
print subdir
...产量
由于我对Python的了解有限,我认为因为目录已被更改,这会导致walk(src)
的异常,并意味着循环被终止。
如何解决此问题以递归遍历目录并重命名包含{project_name}
的所有目录?
非常感谢:)
答案 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(".")