7

这是 Python 文档的摘录:

如果给出了 exclude,它必须是一个接受一个文件名参数并返回一个布尔值的函数。根据这个值,相应的文件要么被排除(真),要么被添加(假)。

我必须承认我不知道这意味着什么。

此外:

2.7 版后已弃用: exclude 参数已弃用,请改用 filter 参数。为了获得最大的可移植性,filter 应该用作关键字参数而不是位置参数,以便最终删除 exclude 时代码不会受到影响。

好的......以及“过滤器”的定义:

如果指定了过滤器,它必须是一个接受 TarInfo 对象参数并返回更改后的 TarInfo 对象的函数。如果它返回 None,则 TarInfo 对象将从存档中排除。

... 回到原点 :)

我真正需要的是一种将排除的数组(或“:”分隔的字符串)传递给 tarfile.add 的方法。

如果您尝试解释 PyDocs 中的那些段落,我不介意。

PS:

这只是我的想法:

  • 制作源目录内容列表的数组
  • 弹出排除
  • 对剩下的单个数组成员执行 tar.add

但是,我希望以更有文化的方式完成

4

1 回答 1

19

如果给出了 exclude,它必须是一个接受一个文件名参数并返回一个布尔值的函数。根据这个值,相应的文件要么被排除(真),要么被添加(假)。

例如,如果您想排除所有以字母“a”开头的文件名,您可以执行类似...

def exclude_function(filename):
    if filename.startswith('a'):
        return True
    else:
        return False

mytarfile.add(..., exclude=exclude_function)

对于您的情况,您需要类似...

EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']

def exclude_function(filename):
    if filename in EXCLUDE_FILES:
        return True
    else:
        return False

mytarfile.add(..., exclude=exclude_function)

...可以简化为...

EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']

mytarfile.add(..., exclude=lambda x: x in EXCLUDE_FILES)

更新

TBH,我不会太担心弃用警告,但如果你想使用新filter参数,你需要类似...

EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']

def filter_function(tarinfo):
    if tarinfo.name in EXCLUDE_FILES:
        return None
    else:
        return tarinfo

mytarfile.add(..., filter=filter_function)

...可以简化为...

EXCLUDE_FILES = ['README', 'INSTALL', '.cvsignore']

mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)
于 2013-04-14T15:46:34.473 回答