Python:如何在add()的filter方法中访问tarfile.add()的'name'参数?

时间:2016-09-11 16:39:03

标签: python filter compression tarfile

我想在使用 tarfile (python 3.4)创建tar(gz)文件时过滤子目录(跳过它们)。

磁盘上的文件:

  • /家庭/为myuser /温度/ TEST1 /
  • /home/myuser/temp/test1/home/foo.txt
  • /home/myuser/temp/test1/thing/bar.jpg
  • /home/myuser/temp/test1/lemon/juice.png
  • /家庭/为myuser /温度/ TEST1 /

尝试按/home/myuser/temp/test1/压缩tarfile.add()

我使用with-and-path-mode模式。使用完整路径它没关系,但是路径很短我有这个问题: 目录排除不起作用,因为tarfile.add()将 arcname 参数传递给过滤方法 - 而不是name参数!

  

archive.add(entry,arcname = os.path.basename(entry),   滤波器= self.filter_general)

示例:

档案:/home/myuser/temp/test1/thing/bar.jpg - > arcname = test1/thing/bar.jpg

因为/home/myuser/temp/test1/thing中的exclude_dir_fullpath元素,过滤器方法应排除此文件,但它不能,因为过滤方法获取test1/thing/bar.jpg

如何在filter方法中访问tarfile.add()的'name'参数?

def filter_general(item):
    exclude_dir_fullpath = ['/home/myuser/temp/test1/thing', '/home/myuser/temp/test1/lemon']
    if any(dirname in item.name for dirname in exclude_dir_fullpath):
        print("Exclude fullpath dir matched at: %s" % item.name)  # DEBUG
        return None
    return item


def compress_tar():
    filepath = '/tmp/test.tar.gz'
    include_dir = '/home/myuser/temp/test1/'
    archive = tarfile.open(name=filepath, mode="w:gz")
    archive.add(include_dir, arcname=os.path.basename(include_dir), filter=filter_general)

compress_tar()

1 个答案:

答案 0 :(得分:0)

您希望创建一个通用/可重用的函数来过滤掉给定其绝对路径名的文件。我知道对存档名称进行过滤是不够的,因为有时可以包含文件,这取决于文件的来源。

首先,在过滤函数中添加一个参数

def filter_general(item,root_dir):
    full_path = os.path.join(root_dir,item.name)

然后,通过以下方式替换“添加到存档”代码行:

archive.add(include_dir, arcname=os.path.basename(include_dir), filter=lambda x: filter_general(x,os.path.dirname(include_dir)))

过滤器函数已被lambda替换,该{{1}}传递include目录的目录名称(否则,将重复root目录)

现在您的过滤器功能知道根目录,您可以按绝对路径进行过滤,这样您就可以在代码中的多个位置重复使用过滤器功能。