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 时覆盖现有的只读文件