Python tarfile和排除

Kau*_*rin 5 python tarfile

这是Python文档的摘录:

如果给出exclude,则它必须是一个带有一个filename参数并返回一个布尔值的函数.根据此值,相应文件将被排除(True)或添加(False).

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

此外:

自2.7版本不推荐使用:不推荐使用exclude参数,请改用filter参数.为了获得最大的可移植性,filter应该用作关键字参数而不是位置参数,以便在最终删除排除时不会影响代码.

好的......以及"过滤器"的定义:

如果指定了filter,则它必须是一个获取TarInfo对象参数并返回已更改的TarInfo对象的函数.如果它返回None,则将从归档中排除TarInfo对象.

... 回到原点 :)

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

如果你试图解释PyDocs中的那些段落,我不介意.

PS:

这只是我的想法:

  • 创建源目录内容列表的数组
  • 弹出排除
  • 在左边的单个数组成员上执行tar.add

但是,我希望它以更加文明的方式完成

Aya*_*Aya 13

如果给出exclude,则它必须是一个带有一个filename参数并返回一个布尔值的函数.根据此值,相应文件将被排除(True)或添加(False).

例如,如果要排除以字母"a"开头的所有文件名,您可以执行以下操作:

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

mytarfile.add(..., exclude=exclude_function)
Run Code Online (Sandbox Code Playgroud)

对于你的情况,你想要像......

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

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

mytarfile.add(..., exclude=exclude_function)
Run Code Online (Sandbox Code Playgroud)

......可以减少到......

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

mytarfile.add(..., exclude=lambda x: x in EXCLUDE_FILES)
Run Code Online (Sandbox Code Playgroud)

更新

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)
Run Code Online (Sandbox Code Playgroud)

......可以减少到......

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

mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)
Run Code Online (Sandbox Code Playgroud)