使用否定忽略模式的python copytree

8 投票
4 回答
5820 浏览
提问于 2025-04-15 22:38

我正在尝试用Python来复制一个文件和文件夹的树状结构。

请问可以用copytree来复制所有以foo结尾的东西吗?

这里有一个ignore_patterns的功能,我能不能给它一个反向的正则表达式?Python支持这种写法吗?

比如:

copytree(src, dest, False, ignore_pattern('!*.foo'))

这里的!表示不包括任何以foo结尾的东西。

谢谢。

4 个回答

0

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如说,可能会出现错误信息,或者程序运行得不如预期。这时候,我们就需要去查找解决方案,看看有没有人遇到过类似的问题。

StackOverflow是一个很好的地方,很多程序员会在这里分享他们的经验和解决方案。你可以在这里搜索你的问题,看看有没有人已经提供了解决办法。如果找到了合适的答案,记得仔细阅读,确保你理解了每一步。

有时候,问题的解决方案可能会涉及到一些代码示例,像是

def documentation(format):
    call(['make', format, '-C', DOC_SOURCE_DIR])

    if (os.path.exists(DOC_DIR)):
        shutil.rmtree(DOC_DIR)

    ignored = ['doctrees']
    shutil.copytree('{0}/build/'.format(DOC_SOURCE_DIR), DOC_DIR, ignore=shutil.ignore_patterns(*ignored))
这样的代码块。这些代码块通常是用来展示如何实现某个功能或者解决某个问题的。你可以根据这些示例来调整自己的代码,帮助你更好地理解。

总之,遇到问题时不要着急,先在StackOverflow上搜索一下,看看有没有人提供的解决方案,学习别人的经验,慢慢你就会变得更熟练了。

6

在unutbu的回答基础上,下面的内容会先列出所有的文件,然后去掉那些符合“ignore_patterns”的文件,最后把剩下的文件作为需要忽略的文件列表返回。也就是说,它通过两次否定的方式,只复制你想要的文件。

import glob, os, shutil

def copyonly(dirpath, contents):
    return set(contents) - set(
        shutil.ignore_patterns('*.py', '*.el')(dirpath, contents),
        )

shutil.copytree(
    src='.',
    dst='temp/',
    ignore=copyonly,
    )
print glob.glob('temp/*')
8

shutil.copytree 是一个用来复制整个文件夹的函数,它有一个叫做 ignore 的参数。这个 ignore 可以设置成任何可以调用的东西。它的作用是,当你访问一个文件夹时,它会接收这个文件夹的路径和里面的文件列表,然后返回一个需要被忽略的文件和文件夹的名字。

举个例子:

import shutil
def ignored_files(adir,filenames):
    return [filename for filename in filenames if not filename.endswith('foo')]

shutil.copytree(source, destination, ignore=ignored_files)

撰写回答