Python shutil copytree:使用ignore函数保留特定的文件类型 [英] Python shutil copytree: use ignore function to keep specific files types

查看:580
本文介绍了Python shutil copytree:使用ignore函数保留特定的文件类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to figure out how to copy CAD drawings (".dwg", ".dxf) from a source directory with subfolders to a destination directory and maintaining the original directory and subfolders structure.

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

我在以下帖子中的 @martineau 中找到了以下答案:

I found the following answer from @martineau within the following post: 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')

Updated: 18:21. The following code works as expected, except that I'd like to ignore folders that don't contain any include_patterns('.dwg', '.dxf')

推荐答案

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

shutil already contains a function ignore_pattern, so you don't have to provide your own. Straight from the documentation:

from shutil import copytree, ignore_patterns

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

这将复制除.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的名称以下划线开头的事实表明,该函数是您可能会忽略的实现细节.

It's a bit tricky (and not strictly necessairy) to explain what's going on: ignore_patterns returns a function _ignore_patterns as its return value, this function gets stuffed into copytree as a parameter, and copytree calls this function as needed, so you don't have to know or care how to call this function _ignore_patterns. It just means that you can exclude certain unneeded cruft files (like *.pyc) from being copied. The fact that the name of the function _ignore_patterns starts with an underscore is a hint that this function is an implementation detail you may ignore.

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

copytree expects that the folder destination doesn't exist yet. It is not a problem that this folder and its subfolders come into existence once copytree starts to work, copytree knows how to handle that.

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

Now include_patterns is written to do the opposite: ignore everything that's not explicitly included. But it works the same way: you just call it, it returns a function under the hood, and coptytree knows what to do with that function:

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

这篇关于Python shutil copytree:使用ignore函数保留特定的文件类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆