Python:在tarfile中使用过滤器

4

我正在写一个备份脚本,使用tarfile模块。我是Python的初学者。这是我的脚本的一部分 - 所以我有一个需要被打包成tar.gz的路径列表。看到这个帖子,我得出了以下结论。现在归档已经创建,但扩展名为.tmp和.data的文件没有被省略。我正在使用Python 3.5。

L = [path1, path2, path3, path4, path5]
exclude_files = [".tmp", ".data"]
# print L

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

with tarfile.open("backup.tar.gz", "w:gz") as tar:
     for name in L:
        tar.add(name, filter=filter_function)
1个回答

2

您正在比较文件扩展名与完整文件名。

只需使用os.path.splitext并比较扩展名即可:

 if os.path.splitext(tarinfo.name)[1] in exclude_files:

简化代码:使用三元表达式和lambda重写add行,避免使用辅助函数:

tar.add(name, filter=lambda tarinfo: None if os.path.splitext(tarinfo.name)[1] in exclude_files else tarinfo)

谢谢。那个方法可行。我有一个问题,如果我需要将路径添加到排除列表中,应该如何操作? - akya
那将是一个相对路径。您可以执行 os.path.dirname(tarinfo.name) 并与要排除的目录进行比较。我建议您在函数中打印出您要比较的两个部分,以便查看它们是否有可能匹配。如果您一开始就这样做,您会发现您正在将扩展名与完整名称进行比较。 - Jean-François Fabre
我写了这个代替L = [path1, path2, path3, path4, path5] exclude_files = [".tmp", ".data", "/media/Data/Textfiles/Linux", "/media/Data/Textfiles/Old/Pushbullet"] def exclude_function(filename): if filename in exclude_files or os.path.splitext(filename)[1] in exclude_files: return True else: return False with tarfile.open("backup.tar.gz", "w:gz") as tar: for name in L: tar.add(name, exclude=exclude_function) - akya
我对筛选部分不是很清楚。上面的代码适用于在排除列表中提到的每个扩展名文件或路径。至于更短的代码,我只是几天前开始学习Python,所以我尽可能地编写了扩展的代码。一旦我更熟悉这门语言,我会尝试更简洁。 - akya
创建两个列表:一个用于路径排除,另一个用于扩展名排除。我怀疑tar文件中不包含绝对路径。在您的过滤函数中打印它们以查看过滤器输入了什么。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接