替换python中的多个文件和文件夹

2024-10-02 20:37:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我怎样才能着手做这件事呢?我有一个包含很多子文件夹和文件的大文件夹,我想用存储在其他地方的包含相同文件结构的其他文件夹和文件替换多个特定文件夹和文件

BigFolder
|
|--Folder 1
|--Folder 2
|--Folder 3
|--Folder 4
|--File 1
|--File 2


"Backup 1"
|
|--Folder 1
|--Folder 3
|--File 2

"Backup 2"
|
|--Folder 1
|--Folder 3
|--File 2

"Backup 3"
|
|--Folder 1
|--Folder 3
|--File 2

我把“备份”放在引号里,因为这不是真正的目的,但举个例子,它是有效的。所以我应该能够抓取大文件夹的特定内容并将其放入其中一个备份中,然后再进行另一个备份并抓取其内容并将其放入大文件夹中,基本上进行交换。我怎样才能做到这一点?我尝试使用shutil.copytree,但这会引发一个错误,因为我要复制到的文件夹已经存在,非常愚蠢。我还尝试了distutils的copytree,但虽然它可以工作,但它不会复制我想要的文件夹,只复制内容,因此它不会保留文件结构

import shutil

bigFolder = "/home/user/Big Folder"

def swapFiles(newFolder, prevFolder):
    path = os.path
    #Copy from big folder to the previous backup
    shutil.copytree(path.join(bigFolder, "Folder 1"), prevFolder)
    shutil.copytree(path.join(bigFolder, "Folder 3"), prevFolder)
    shutil.copy(path.join(bigFolder, "File 2"), prevFolder)

    #Copy from new folder to big folder
    shutil.copytree(newFolder, bigFolder)

这不起作用,因为目标文件夹已经存在,它只对不存在的文件夹起作用。带distutils:

from distutils.dir_util import copy_tree
import shutil

bigFolder = "/home/user/Big Folder"

def swapFiles(newFolder, prevFolder):
    path = os.path
    #Copy from big folder to the previous backup
    copy_tree(path.join(bigFolder, "Folder 1"), prevFolder)
    copy_tree(path.join(bigFolder, "Folder 3"), prevFolder)
    shutil.copy(path.join(bigFolder, "File 2"), prevFolder) #shutil is fine here

    #Copy from new folder to big folder
    copy_tree(newFolder, bigFolder)

这不起作用,因为它复制文件夹的内容,而不是文件夹本身,所以我不保留文件结构

顺便说一下,在这两个复制过程中间,我应该删除文件和文件夹以避免与NeXFLASH的文件夹合并,但这与问题无关。p>


Tags: 文件pathfrom文件夹内容folderfilejoin
2条回答

我找到了一个解决方案,结果证明,shutil的愚蠢限制,即只能将文件复制到不存在的文件夹中,这一限制毕竟是有用的,但我还需要使用distutils的copy_tree函数,幸运的是它们都是stdlib。首先,创建一个包含所有要复制的文件和文件夹的列表,如下所示:

filesToCopy = ["File 2", "Folder 1", "Folder 3"]

然后我们需要为每个阶段创建两个循环

import shutil, os
from distutils.dir_util import copy_tree

def swapFiles(newDir, prevDir):
    bigFolder = "Big Folder/Path"

    #Copy from the big folder to the prevDir
    for file in filesToCopy:
    #Check if what you're about to copy is a directory
    if os.path.isdir(os.path.join(bigFolder, file)):
        copy_tree(os.path.join(bigFolder, file), os.path.join(prevDir, file))
    else:
        #If its a file, do a simple copy
        shutil.copy(os.path.join(bigFolder, file), os.path.join(prevDir, file))

    #Remove the copies folders from the big folder
    for file in filesToCopy:
        if os.path.isdir(os.path.join(bigFolder, file)):
            shutil.rmtree(os.path.join(bigFolder, file))
        else:
            os.remove(os.path.join(bigFolder, file))

    #Copy over files from newDir to bigFolder
    for file in filesToCopy:
        if os.path.isdir(os.path.join(newDir, file)):
            #I use shutil's copytree here because I want it to create the folders I deleted in the previous step
            shutil.copytree(os.path.join(newDir, file), os.path.join(bigFolder, file))
        else:
            shutil.copy(os.path.join(newDir, file), os.path.join(bigFolder, file))

这样,文件结构就得到了维护,并且很容易指定要交换的文件和文件夹

#recursively merge two folders including subfolders
def mergefolders(root_src_dir, root_dst_dir):
    for src_dir, dirs, files in os.walk(root_src_dir):
        dst_dir = src_dir.replace(root_src_dir, root_dst_dir, 1)
        if not os.path.exists(dst_dir):
            os.makedirs(dst_dir)
        for file_ in files:
            src_file = os.path.join(src_dir, file_)
            dst_file = os.path.join(dst_dir, file_)
            if os.path.exists(dst_file):
                os.remove(dst_file)
            shutil.copy(src_file, dst_dir)

资料来源:https://lukelogbook.tech/2018/01/25/merging-two-folders-in-python/

相关问题 更多 >