我正在使用shutil copytree复制文件夹和主文件夹内的所有子文件夹
import shutil
import sys
import os
import re
SOURCE_FOLDER = sys.argv[1]
DESTINATION_FOLDER = sys.argv[2]
def copyDirectory(SOURCE_FOLDER, DESTINATION_FOLDER):
try:
print SOURCE_FOLDER
print DESTINATION_FOLDER
shutil.copytree(SOURCE_FOLDER, DESTINATION_FOLDER)
# Directories are the same
#except:
# print "Not copied"
except shutil.Error as e:
print('Directory not copied. Error: %s' % e)
# Any error saying that the directory doesn't exist
except OSError as e:
print('Directory not copied. Error: %s' % e)
copyDirectory(SOURCE_FOLDER,DESTINATION_FOLDER)
问题是如果目录存在就会抛出错误
Directory not copied. Error: [Errno 17] File exists: 'destination'
我想要的是,如果目录已经存在,它想要检查所有子目录,如果子目录也存在,它应该检查其中的所有文件,它应该跳过现有文件并复制该子目录中的新文件,如果子目录direscotry 不存在,那么它应该复制该子目录
注意:子目录可能是嵌套的(子目录的子目录)。
但是上面的脚本不起作用,我应该在该脚本中添加什么?
shutil.copytree
不是为了跳过现有的目标文件和目录而编写的。来自文档
目标目录不得已存在。
您需要编写自己的解决方案。现有的
copytree
代码是一个好的开始。
更新
正如 @STF 所指出的,从 python 3.8 开始,添加了
dirs_exist_ok
参数。
从
python3.8
开始,您可以使用 shutil.copytree
以及忽略现有目录错误的选项:
shutil.copytree(SOURCE_FOLDER, DESTINATION_FOLDER, dirs_exist_ok=True)
更多信息可以在这里找到:https://docs.python.org/3/library/shutil.html#shutil.copytree
为了检查目录是否已存在,您可以使用:os.path.exists(directory)
if not os.path.exists(DESTINATION_FOLDER):
shutil.copytree(SOURCE_FOLDER, DESTINATION_FOLDER)
如果 dest 目录已经存在,您可以在 src-dir 的子目录上运行您的函数。 您可以使用以下函数获取所有 src-dir 子目录的列表,该函数获取目录名称作为输入,并返回子目录列表
def SubDirPath (d):
return filter(os.path.isdir, [os.path.join(d,f) for f in os.listdir(d)])
使用此目录列表,您可以在目录的每个实例上再次执行您的函数。
对于同时存在于 src 和 dst 中的每个目录 - 您需要检查 src-dir 中的每个文件是否也存在于 dst-dir 中。
致以诚挚的问候,
亚龙