当前位置: 代码迷 >> python >> Python,重命名子目录
  详细解决方案

Python,重命名子目录

热度:115   发布时间:2023-06-16 10:26:29.0

(使用2.7)

当前有问题,我一直在尝试执行os.walk / os.rename的过程。 但是目前,只有主文件被附加_final,而不是该文件中的所有文件。

所以举个例子

主--> sub1-> sub2-> sub3

需要是

Main_final(当前在此处停止)----> sub1_final-> sub2_final-> sub3_final

这是我目前的代码,

import shutil
import sys
import os

def rename():
        ### pseudo
        for folderName, subfolders, filenames in os.walk(path, topdown=##???):
            for subfolder in subfolders:
                print subfolder
                os.rename(os.path.join(folderName, subfolders), os.path.join(folderName, subfolders + 'rename'))

            print('')

    else:
        print("Directory does not exist")

if __name__ == '__main__':
    copy()

在topdown设置为False的树上移动-首先重命名子目录,最后重命名顶层目录,重命名顶层目录将不再影响子目录。

如果可选参数topdown为True或未指定,则将在其任何子目录的三元组之前生成目录的三元组(目录是自上而下生成的)。 如果topdown为False,则在其所有子目录的三元组之后生成目录的三元组(目录是自下而上生成的)。 无论topdown的值如何,都将在生成目录及其子目录的元组之前检索子目录的列表。

当topdown为True时,调用者可以就地修改目录名称列表(也许使用del或slice分配),而walk()将仅递归到其名称仍保留在目录名称中的子目录中。 这可用于修剪搜索,强加特定的访问顺序,甚至可在调用者再次恢复walk()之前向walk()告知调用者创建或重命名的目录。 当topdown为False时修改目录名对走动的行为没有影响,因为在自下而上模式下,目录名中的目录是在生成目录路径本身之前生成的。

import os

path = "path/to/folder"
for root, dirs, files in os.walk(path, topdown=False):
    for dirname in dirs:
        print os.path.join(root, dirname)
        os.rename(os.path.join(root, dirname), os.path.join(root, dirname+"_Final"))

os.walk(fc)返回一个生成器对象,因此,如果您在遍历或迭代期间编辑条目,则os.walk混淆(它使用dfs遍历算法,因此先前的堆栈条目不再存在),因此引发StopIteration

您需要首先获取所有条目并按最深条目的顺序重命名文件。

import shutil
import sys
import os
from operator import itemgetter

def copy():

    print("copy program")
    set_path = "D:\\test\\test1"
    os.chdir(set_path)

    if os.path.exists(set_path):
        fc ='D:\\test\\test1\\final'
        working = '_final'
        shutil.copytree(set_path, fc)
        os.chdir(fc)


        stack = [0]
        entries = []
        for folder, subfolders, files in os.walk(fc):
            lev = stack.pop()
            for subfolder in subfolders:
                entries.append((os.path.join(folder, subfolder), lev + 1))
            for file in files:
                entries.append((os.path.join(folder, file), lev + 1))
            stack.extend([lev + 1]*len(subfolders))
        for fpath in map(itemgetter(0), sorted(entries, key=lambda x: -x[1])):
            os.rename(fpath, fpath + working)

    else:
        print("Directory does not exist")

if __name__ == '__main__':
    copy()

它在我的系统上工作

  相关解决方案