如何跳过子文件夹中的现有文件并仅复制新文件

问题描述 投票:0回答:3

我正在使用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 不存在,那么它应该复制该子目录

注意:子目录可能是嵌套的(子目录的子目录)。

但是上面的脚本不起作用,我应该在该脚本中添加什么?

python directory copy shutil
3个回答
1
投票

shutil.copytree
不是为了跳过现有的目标文件和目录而编写的。来自文档

目标目录不得已存在。

您需要编写自己的解决方案。现有的

copytree
代码是一个好的开始。

更新

正如 @STF 所指出的,从 python 3.8 开始,添加了

dirs_exist_ok
参数。


1
投票

python3.8
开始,您可以使用
shutil.copytree
以及忽略现有目录错误的选项:

shutil.copytree(SOURCE_FOLDER, DESTINATION_FOLDER, dirs_exist_ok=True)

更多信息可以在这里找到:https://docs.python.org/3/library/shutil.html#shutil.copytree


0
投票

为了检查目录是否已存在,您可以使用: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 中。

致以诚挚的问候,

亚龙

© www.soinside.com 2019 - 2024. All rights reserved.