Python 重命名其中的文件夹和文件

Python 重命名其中的文件夹和文件,python,python-3.x,Python,Python 3.x,上面的代码使用其当前文件名详细信息将一组文件夹中的所有文件重命名为“x级深度的文件x”,但我希望它也将这些文件的文件夹重命名为“x级深度的文件夹x”,但它会给出一个错误,指出该文件夹已在另一个进程中打开。上面的评论是我到目前为止所做的(没有成功),其余的都是我想做的 import os, re def everydirectory(path): for file in os.listdir(path): file_w_path = os.path.join(path,

上面的代码使用其当前文件名详细信息将一组文件夹中的所有文件重命名为“x级深度的文件x”,但我希望它也将这些文件的文件夹重命名为“x级深度的文件夹x”,但它会给出一个错误,指出该文件夹已在另一个进程中打开。上面的评论是我到目前为止所做的(没有成功),其余的都是我想做的

import os, re

def everydirectory(path):
    for file in os.listdir(path):
        file_w_path = os.path.join(path, file)
        os.chdir(path)
        if os.path.isdir(file_w_path):
            os.chdir(file_w_path)
            # complete_folder_name = re.search("(deep)([0-9])(FOLDER)([0-9])", file)
            # deepness = complete_folder_name.group(2)
            # folder_number = complete_folder_name.group(4)
            # new_folder_name = "Folder {} at {} levels deep".format(folder_number, deepness)
            # new_folder_name_w_path = os.path.join(path, new_folder_name)
            # os.rename(file_w_path, new_folder_name_w_path)
            # print("Folder " + file_w_path + " renamed to " + new_folder_name_w_path)
            everydirectory(file_w_path)
        elif os.path.isfile(file_w_path):
            path = os.path.join(path, os.getcwd())
            extension = os.path.splitext(file_w_path)[1]
            complete_file_name = re.search("(deep)([0-9])(FILE)([0-9])", file)
            deepness = complete_file_name.group(2)
            file_number = complete_file_name.group(4)
            new_file_name = "File {} at {} levels deep{}".format(file_number, deepness, extension)
            new_file_name_w_path = os.path.join(path, new_file_name)
            os.rename(file_w_path, new_file_name_w_path)
            print("File " + file_w_path + " RENAMED TO " + new_file_name_w_path)

directory = input("Where is the files?")
everydirectory(directory)
我认为问题在于,在程序重命名文件夹后,它会重命名文件,使其“丢失”文件的原始位置。有人能看看我做错了什么吗?谢谢


下面是一组文件夹/文件,以及我希望它在运行脚本后的外观:

为了使代码正常工作,我对代码进行了一些重构。我还跟踪了递归中的
deep
,但如果您愿意,也可以使用文件名:

import os, re
import os.path
from contextlib import contextmanager

@contextmanager
def change_dir(directory):
    wd = os.getcwd()
    try:
        os.chdir(directory)
        yield directory
    finally:
        os.chdir(wd)


def rename_file(filename, deep, is_dir=False):
    if is_dir:
        complete_filename = re.search("(deep)([0-9])(FOLDER)([0-9])", filename)
        file_number = complete_filename.group(4)
        new_filename = "Folder {} at {} levels deep".format(file_number, deep)
    else:
        complete_filename = re.search("(deep)([0-9])(FILE)([0-9])", filename)
        file_number = complete_filename.group(4)
        extension = os.path.splitext(filename)[1]
        new_filename = "File {} at {} levels deep{}".format(file_number, deep, extension)

    os.rename(filename, new_filename)


def every_directory(path, deep=0):
    deep += 1
    for file in os.listdir(path):
        is_dir = False
        filepath = os.path.join(path, file)
        if os.path.isdir(filepath):
            every_directory(filepath, deep)
            is_dir = True
        with change_dir(path):
            rename_file(file, deep=deep, is_dir=is_dir)

这种重命名任务的常用方法是使用递归从目录树的底部向上工作。重命名目录的内容,然后重命名其父目录的内容。在调用
everydirectory(file\u w\u path)
后,尝试重命名文件夹,这样可以处理目录中的任何文件。或者它应该是
everydirectory(new\u folder\u name\u w\u path)
使用命名路径而不是旧路径?@PM2Ring我如何使用递归?我试着像你说的那样,先用函数重命名文件,然后重命名文件夹,但仍然会出现同样的错误。我读过关于os.walk(topdown=False)的书,但不知道如何使用它,这就是你所说的吗?如果你看下面的答案,你会看到一个递归解决问题的例子@setti7I开始使用python编程,但从未见过这个“@contextmanager”,它是做什么的呢?
contextmanager
只是一个方便的装饰器,可以用来定义一个函数,该函数可以与
with
-语句一起使用,而无需创建类或单独的uuu enter\uuuuuuu()和uuuu exit\uuuuuu()方法。如果您想了解更多信息,请查看python中的with语句decorators。当您掌握了这两件事后,您可以看看contextlib的文档:谢谢!我已经几乎解决了我的问题,没有使用装饰(还没有了解他们)。但我现在陷入了困境:我的“修复”新脚本没有更改第一个文件夹(主文件夹,而不是deep1FOLDER1)的文件名,我不知道为什么。你能帮我看看吗?更多关于这个