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

How to skip existing files in sub folders and copy only new files

我是使用shutil copytree复制文件夹和主文件夹中的所有子文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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)

问题是,如果目录存在,则会引发错误

1
Directory not copied. Error: [Errno 17] File exists: 'destination'

我想要的是,如果目录已经存在,它要检查所有的子目录,如果子目录也存在,它应该检查其中的所有文件,它应该跳过现有的文件并复制该子目录中的新文件,如果子目录不存在,那么它应该复制该子目录。

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

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


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

The destination directory must not already exist.

您需要编写自己的解决方案。现有的copytree代码是一个良好的开端。


为了检查目录是否已经存在,可以使用:os.path.exists(目录)

1
2
if not os.path.exists(DESTINATION_FOLDER):
    shutil.copytree(SOURCE_FOLDER, DESTINATION_FOLDER)

如果dest目录已经存在,可以在src目录的子目录上运行函数。您可以使用以下函数获取所有SRC DIR子目录的列表,该函数将目录名作为输入,并返回子目录的列表

1
2
def SubDirPath (d):
    return filter(os.path.isdir, [os.path.join(d,f) for f in os.listdir(d)])

使用这个目录列表,您可以在目录的每个实例上再次执行您的函数。

对于同时存在于:src和dst中的每个目录,如果文件也存在于dst目录中,则需要检查src目录中的每个文件。

最好的问候,

亚龙