首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用shutil.copytree时过滤目录?

使用shutil.copytree时过滤目录?
EN

Stack Overflow用户
提问于 2011-10-21 04:47:42
回答 4查看 14.4K关注 0票数 14

有没有一种方法可以使用目录的绝对路径来过滤目录?

代码语言:javascript
复制
shutil.copytree(directory,
                target_dir,
                ignore = shutil.ignore_patterns("/Full/Path/To/aDir/Common")) 

当尝试过滤位于"aDir“下的”公共“目录时,这似乎不起作用。如果我这样做:

代码语言:javascript
复制
shutil.copytree(directory,
                target_dir,
                ignore = shutil.ignore_patterns("Common"))

它可以工作,但每个名为Common的目录都会被过滤到那个“树”中,这不是我想要的。

有什么建议吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-21 05:01:46

您可以创建自己的ignore函数:

代码语言:javascript
复制
shutil.copytree('/Full/Path', 'target',
              ignore=lambda directory, contents: ['Common'] if directory == '/Full/Path/To/aDir' else [])

或者,如果您希望能够使用相对路径调用copytree

代码语言:javascript
复制
import os.path
def ignorePath(path):
  def ignoref(directory, contents):
    return (f for f in contents if os.abspath(os.path.join(directory, f)) == path)
  return ignoref

shutil.copytree('Path', 'target', ignore=ignorePath('/Full/Path/To/aDir/Common'))

从文档中:

如果给定了ignore,则它必须是一个可调用函数,该函数将接收os.listdir()返回的由copytree()访问的目录及其内容列表作为其参数。因为copytree()是递归调用的,所以对于复制的每个目录,都会调用一次ignore callable。callable必须返回与当前目录相关的目录和文件名序列(即其第二个参数中的项的子集);然后在复制过程中将忽略这些名称。ignore_patterns()可用于创建忽略基于glob样式模式的名称的可调用对象。

票数 14
EN

Stack Overflow用户

发布于 2011-10-21 05:03:31

shutil.ignore_patterns()的API不支持绝对路径,但是使用您自己的变体非常容易。

作为起点,请看*ignore_patterns*的源代码

代码语言:javascript
复制
def ignore_patterns(*patterns):
    """Function that can be used as copytree() ignore parameter.

    Patterns is a sequence of glob-style patterns
    that are used to exclude files"""
    def _ignore_patterns(path, names):
        ignored_names = []
        for pattern in patterns:
            ignored_names.extend(fnmatch.filter(names, pattern))
        return set(ignored_names)
    return _ignore_patterns

您可以看到,它返回一个接受路径和名称列表的函数,并返回一组要忽略的名称。为了支持您的用例,创建您自己的类似函数,该函数使用利用路径参数。将您的函数传递给copytree()调用中的ignore参数。

或者,不要按原样使用shutil。源代码短小精悍,因此很容易剪切、粘贴和定制。

票数 4
EN

Stack Overflow用户

发布于 2011-10-21 05:07:38

您可能希望创建自己的ignore函数,该函数检查正在处理的当前目录,并仅当目录为'/Full/Path/ to /aDir‘时才返回一个包含'Common’的列表。

代码语言:javascript
复制
def ignore_full_path_common(dir, files):
    if dir == '/Full/Path/To/aDir':
        return ['Common']
    return []

shutil.copytree(directory, target_dir, ignore=ignore_full_path_common)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7842044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档