Python shutil copytree:使用ignore函数保留特定的文件类型

Python shutil copytree: use ignore function to keep specific files types

我试图弄清楚如何将具有子文件夹的CAD图形(" .dwg","。dxf")从源目录复制到目标目录,并保持原始目录和子文件夹的结构。

  • 原始目录:H:\ Tanzania ... \ Bagamoyo_Single_line.dwg
  • 源目录:H:\ CAD \ Tanzania ... \ Bagamoyo_Single_line.dwg

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

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


shutil已经包含一个功能ignore_pattern,因此您不必提供自己的功能。直接来自文档:

1
2
3
from shutil import copytree, ignore_patterns

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

This will copy everything except .pyc files and files or
directories whose name starts with tmp.

解释所发生的事情有些棘手(并非严格必要):ignore_patterns返回函数_ignore_patterns作为其返回值,该函数作为参数填充到copytree中,而copytree将该函数称为是必需的,因此您不必知道或不在乎如何调用此函数_ignore_patterns。这仅表示您可以从复制中排除某些不需要的草稿文件(例如*.pyc)。函数_ignore_patterns的名称以下划线开头的事实表明,该函数是您可能会忽略的实现细节。

copytree期望文件夹destination尚不存在。一旦copytree开始工作,此文件夹及其子文件夹就存在了,这不是问题,copytree知道如何处理。

现在编写include_patterns的目的相反:忽略所有未明确包括的内容。但是它的工作方式相同:您只需调用它,它就会在后台返回一个函数,而coptytree知道该函数的作用:

1
copytree(source, destination, ignore=include_patterns('*.dwg', '*.dxf'))