2

我想在调用 shutil.copytree() 时指定可忽略文件和目录的完整路径。就像是

def my_ignore(dir, files):

    # return ["exclude.file"] # working

    return ["/full_path_to/exclude.file"] # Not working

shutil.copytree(src, dest, ignore=my_ignore)

在此之后,排除的文件仍然存在,除非我只返回文件名而不是完整路径。问题是我真的想设置一个特定的文件,而不是不同目录下的所有匹配文件名。

我这里提到了一些问题,比如: How to write a call back function for ignore in shutil.copytree

使用 shutil.copytree 时过滤目录?

但没有一个答案有效。看起来忽略钩子只能返回一个全局样式,并且任何构造的完整路径都不起作用。

我错过了什么吗?

4

2 回答 2

1

ignore确实必须只返回被忽略的文件名。但是,每次目录shutil.copytree()访问都会调用该函数;你可以忽略每个目录的文件。

如果您有需要忽略的文件的完整路径,则匹配传递给ignore函数的第一个参数;它是该目录的完整路径:

def my_ignore(dir, files):
    if dir == '/full_path_to':
        return {"exclude.file"}

我在这里返回一套;设置成员资格测试比使用列表更快。

如果您有一组预定义的要忽略的路径,请将它们解析到字典中;键是目录路径,值是该路径中的文件名集:

from collections import defaultdict

to_ignore = defaultdict(set)
for path in ignored_paths:
    dirname, filename = os.path.split(path)
    to_ignore[dirname].add(filename)

def my_ignore(src, files):
    return to_ignore.get(src, set())
于 2013-07-09T17:49:06.167 回答
1

这不是魔术。copytree()一次复制一个目录的内容,它专门在您返回的忽略列表中查找文件名。完整路径永远不是文件名,因此永远不会匹配。

但是,该dir参数将帮助您做您想做的事:

def my_ignore(dir, files):
    if dir == "/full/path/to":
        return ["exclude.file"]
    else:
        return []
于 2013-07-09T17:50:09.530 回答