【问题标题】:copy folder, subfolders and files from a path to another path in python via a recursive function通过递归函数将文件夹,子文件夹和文件从路径复制到python中的另一个路径
【发布时间】:2017-10-28 07:19:33
【问题描述】:

我想将一些文件夹和文件从一个路径复制到另一个路径。例如,我想将包含其他子文件夹和一些文件的文件夹(称为文件夹 1)复制到另一个文件夹(dst)。在我的程序中,首先,我想检查目标文件夹中是否有一个名为 folder1 的文件夹,如果没有,则创建一个名为 folder1 的文件夹,然后将 folder1 的内容复制到目标。另外,也许我们在目标路径中有文件夹1,但是文件夹1的一些子文件夹在目标中不存在,我们必须为此使用递归函数。这是我为此目的的递归函数:

def CopyFol_Subfolders(src, src_folder, dst):
    Dir = next(os.walk(src))[1]
    sub_files = ""
    sub_files = next(os.walk(src))[2]
    if not os.path.exists(dst + "/" + src_folder):
        os.makedirs(dst + "/" + src_folder)
        shutil.copy2(src + "/" + src_folder, dst + "/" + src_folder)

    elif os.path.exists(src + "/" + src_folder) and is_exist_file(src+"/"+src_folder,dst+"/"+src_folder,sub_files):
        copy_files(sub_files, src+"/"+src_folder, dst+"/"+src_folder)
    else:
        subfolders = ""
        subfolders = next(os.walk(src + "/" + src_folder+"/"))[1]
        for folder in subfolders:
            CopyFol_Subfolders(src + "/" + src_folder, folder, dst + "/" + src_folder)

copy_files 函数会将文件从src +"/"+src_folder 复制到dst+"/"+src_folder

我很困惑,这不起作用。我在shutil.copy2 中遇到了不同的错误,告诉我x is not a filex is a directory。 能否请一些人检查我的递归函数的逻辑并让我知道这是什么问题?

【问题讨论】:

    标签: python recursion directory shutil


    【解决方案1】:

    使用os.path.isdir 而不是os.path.exists 以确保它只能是目录而不是文件。并且os.path.join 比我们自己连接路径字符串要好。

    def CopyFol_Subfolders(src, dst):
        for item in os.listdir(src):
            s = os.path.join(src, item)
            d = os.path.join(dst, item)
            if os.path.isdir(s):
                CopyFol_Subfolders(s, d)
            else:
                shutil.copy2(s, d)
    

    【讨论】:

    • 这种回答套件在评论中。
    • 这是一个完整的答案,对我有很大帮助。谢谢@frankyjuang
    • 嗨@frankyjuang,对不起,我在我的程序中使用你的代码。但它似乎覆盖了一些在目标和 src 路径中名称相同的文件或文件夹。您能否帮助我如何以不覆盖这些文件和文件夹的方式更改代码?谢谢
    • 覆盖是什么意思?能否提供详细的目录/文件结构?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2020-05-09
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多