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

替换python中的多个文件和文件夹,python,python-3.x,directory-structure,Python,Python 3.x,Directory Structure,我怎样才能着手做这件事呢?我有一个包含很多子文件夹和文件的大文件夹,我想用存储在其他地方的包含相同文件结构的其他文件夹和文件替换多个特定文件夹和文件 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

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

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,但虽然它可以工作,但它不会复制我想要的文件夹,只复制内容,因此它不会保留文件结构

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
bigFolder=“/home/user/Big Folder”
def交换文件(新建文件夹、prevFolder):
path=os.path
#从大文件夹复制到上一个备份
copytree(path.join(bigFolder,“文件夹1”),prevFolder)
copytree(path.join(bigFolder,“文件夹3”),prevFolder)
copy(path.join(bigFolder,“文件2”),prevFolder)
#从新文件夹复制到大文件夹
copytree(newFolder、bigFolder)
这不起作用,因为目标文件夹已经存在,它只对不存在的文件夹起作用。带distutils:

来自distutils.dir\u util导入复制树
进口舒蒂尔
bigFolder=“/home/user/Big Folder”
def交换文件(新建文件夹、prevFolder):
path=os.path
#从大文件夹复制到上一个备份
复制_树(path.join(bigFolder,“文件夹1”),prevFolder)
复制_树(path.join(bigFolder,“文件夹3”),prevFolder)
shutil.copy(path.join(bigFolder,“文件2”),prevFolder)#shutil在这里很好
#从新文件夹复制到大文件夹
复制目录树(新建文件夹、大文件夹)
这不起作用,因为它复制文件夹的内容,而不是文件夹本身,所以我不保留文件结构

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

顺便说一下,在这两个复制过程中间,我应该删除文件和文件夹以避免与新文件夹的合并,但这与问题无关。< /P> <代码>→递归合并包含子文件夹的两个文件夹。 def合并文件夹(根目录、根目录、根目录): 对于src_dir、dirs和os.walk(root_src_dir)中的文件: dst_dir=src_dir.replace(root_src_dir,root_dst_dir,1) 如果操作系统路径不存在(dst_dir): 操作系统生成目录(dst_目录) 对于文件中的文件: src_file=os.path.join(src_dir,file) dst_file=os.path.join(dst_dir,file) 如果os.path.exists(dst_文件): 删除操作系统(dst_文件) 复制(src_文件,dst_目录)


来源:

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

filesToCopy=[“文件2”、“文件夹1”、“文件夹3”]
然后我们需要为每个阶段创建两个循环

导入shutil,操作系统
从distutils.dir\u util导入复制树
def交换文件(newDir、prevDir):
bigFolder=“大文件夹/路径”
#从大文件夹复制到prevDir
对于文件目录中的文件:
#检查您要复制的是否是目录
如果os.path.isdir(os.path.join(bigFolder,file)):
复制_树(os.path.join(bigFolder,file),os.path.join(prevDir,file))
其他:
#如果它是一个文件,做一个简单的复制
copy(os.path.join(bigFolder,file),os.path.join(prevDir,file))
#从大文件夹中删除副本文件夹
对于文件目录中的文件:
如果os.path.isdir(os.path.join(bigFolder,file)):
rmtree(os.path.join(bigFolder,file))
其他:
删除(os.path.join(bigFolder,file))
#将文件从newDir复制到bigFolder
对于文件目录中的文件:
如果os.path.isdir(os.path.join(newDir,file)):
#我在这里使用shutil的copytree,因为我希望它创建我在上一步中删除的文件夹
copytree(os.path.join(newDir,文件),os.path.join(bigFolder,文件))
其他:
copy(os.path.join(newDir,文件),os.path.join(bigFolder,文件))

有了它,文件结构得以保持,并且很容易指定要交换的文件和文件夹。

在使用
shutil.copytree
时,您是否尝试过设置
dirs\u exist\u ok=True
?不,不知道该选项存在,它没有列在我查找它的页面上。我会检查它,但它可能会有相同的问题,不保持文件夹结构。编辑:它告诉我它不存在。请提供一个。这将有助于将备份内容放入大文件夹,但不是viceversa,因为我不希望大文件夹中的每个文件都存在,而是特定的文件。