Python tarfile 和排除

Posted

技术标签:

【中文标题】Python tarfile 和排除【英文标题】:Python tarfile and excludes 【发布时间】:2013-04-14 15:30:28 【问题描述】:

这是 Python 文档的摘录:

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

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

此外:

自 2.7 版起已弃用:不建议使用 exclude 参数, 请改用过滤器参数。为了获得最大的便携性, 过滤器应该用作关键字参数而不是 位置参数,以便在排除时不会影响代码 最终被删除。

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

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

...回到第一格:)

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

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

附:

这只是我的想法:

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

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

【问题讨论】:

【参考方案1】:

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

例如,如果您想排除所有以字母“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)

【讨论】:

太棒了!谢谢!但是不推荐使用排除的那个位呢? 太棒了!我会坚持过滤,只是为了安全起见。非常感谢! 差不多 5 年后,这刚刚回答了我的问题。谢谢@Aya! 如何排除子目录?

以上是关于Python tarfile 和排除的主要内容,如果未能解决你的问题,请参考以下文章

Python:tarfile流

使用 Python 的 tarfile 时覆盖现有的只读文件

使用 Python 的 tarfile 创建 tarball 时保留文件权限

Python_面向对象_zipfile和tarfile

带有 bz2 数据的 Python TarFile

tarfile/zipfile/shutil