【问题标题】:How to skip existing files in sub folders and copy only new files如何跳过子文件夹中的现有文件并仅复制新文件
【发布时间】:2016-06-29 01:32:13
【问题描述】:

我是使用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'

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

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

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

【问题讨论】:

  • 来自文档“目标目录必须不存在。” 也许您可以复制代码并根据需要进行调整。

标签: python directory copy shutil


【解决方案1】:

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

目标目录必须不存在。

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

【讨论】:

    【解决方案2】:

    为了检查目录是否已经存在,你可以使用: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 中的每个目录 - 如果文件也存在于 dst-dir 中,则需要检查 src-dir 中的每个文件。

    最好的问候,

    亚纶

    【讨论】:

    • 如果你给我完整的工作代码就好了,上面的代码让我很困惑?
    • 还有什么是d和f
    • 我已经包装了过滤器命令,带有一个接收目录作为输入的函数,并返回该目录的子目录列表
    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 2015-12-26
    • 2020-03-08
    • 1970-01-01
    • 2018-10-13
    • 2021-06-09
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多