23

我试图弄清楚如何将 CAD 图纸(“.dwg”、“.dxf)从带有子文件夹的源目录复制到目标目录并维护原始目录和子文件夹结构。

  • 原始目录:H:\Tanzania...\Bagamoyo_Single_line.dw​​g
  • 源目录:H:\CAD\Tanzania...\Bagamoyo_Single_line.dw​​g

我在以下帖子中从@martineau找到了以下答案:Python Factory Function

from fnmatch import fnmatch, filter
from os.path import isdir, join
from shutil import copytree

def include_patterns(*patterns):
    """Factory function that can be used with copytree() ignore parameter.

    Arguments define a sequence of glob-style patterns
    that are used to specify what files to NOT ignore.
    Creates and returns a function that determines this for each directory
    in the file hierarchy rooted at the source directory when used with
    shutil.copytree().
    """
    def _ignore_patterns(path, names):
        keep = set(name for pattern in patterns
                            for name in filter(names, pattern))
        ignore = set(name for name in names
                        if name not in keep and not isdir(join(path, name)))
        return ignore
    return _ignore_patterns

# sample usage

copytree(src_directory, dst_directory,
         ignore=include_patterns('*.dwg', '*.dxf'))

更新时间:18:21。以下代码按预期工作,除了我想忽略不包含任何 include_patterns('. dwg', ' .dxf')的文件夹

4

1 回答 1

43

shutil已经包含一个函数ignore_patterns,所以你不必提供你自己的。直接来自文档

from shutil import copytree, ignore_patterns

copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))

这将复制除.pyc名称以开头的文件和文件或目录之外的所有内容tmp.

解释发生了什么有点棘手(并且不是绝对必要):ignore_patterns返回一个函数作为它的返回值,这个函数作为参数_ignore_patterns填充,并根据需要调用这个函数,所以你不必知道或关心如何调用这个函数。这只是意味着您可以从复制中排除某些不需要的杂乱文件(如 )。函数名称以下划线开头的事实暗示该函数是您可能忽略的实现细节。copytreecopytree_ignore_patterns*.pyc_ignore_patterns

copytree预计该文件夹destination尚不存在。copytree一旦开始工作,这个文件夹及其子文件夹就会出现,copytree知道如何处理,这不是问题。

现在include_patterns写做相反的事情:忽略所有未明确包含的内容。但它的工作原理是一样的:你只需调用它,它会在后台返回一个函数,并且coptytree知道如何处理该函数:

copytree(source, destination, ignore=include_patterns('*.dwg', '*.dxf'))
于 2017-02-27T14:41:53.457 回答