python shutil.copytree()的忽略回调不接受完整路径

python shutil.copytree()的忽略回调不接受完整路径,python,ignore,shutil,copytree,Python,Ignore,Shutil,Copytree,我想在调用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) 在此之后,被排除的文件仍然存在,除非我只返回文件名而不是完整路径。问题

我想在调用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)
在此之后,被排除的文件仍然存在,除非我只返回文件名而不是完整路径。问题是我真的想设置一个特定的文件,而不是不同目录下所有匹配的文件名

我在这里提到了一些问题,例如:

但没有一个答案是有效的。看起来ignore钩子只能返回glob样式,任何构造的完整路径都无法工作


我遗漏了什么吗?

忽略确实必须只返回被忽略的文件名。但是,对于每个目录
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())

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

但是,
dir
参数将帮助您执行所需操作:

def my_ignore(dir, files):
    if dir == "/full/path/to":
        return ["exclude.file"]
    else:
        return []

在一个集合中进行成员资格测试并不比在只有一个项目时使用列表快。:-)@kindall:我怀疑一次只能有一个文件名。@MartijnPieters被忽略\u路径列表?我尝试了你的代码,但得到了一个错误:File“/HelloCopytree.py”,第28行,在我的\u ignore2返回到\u ignore.get(folder,set())类型错误:get()不接受关键字参数错误:我将default=set()作为关键字参数放在那里。您的代码运行良好。谢谢