如何使用Python将tar文件保存在平面tar.gz中

时间:2018-08-12 22:27:44

标签: python gzip tar

我有一个具有以下结构的tar文件:

example.tar
--file1
--file2

并且我要将文件另存为tar.gz,因此它看起来像:

example.tar.gz
--file1
--file2

我尝试在TarFile.add()模块中使用tarfile,但是我只设法用另一个层次结构创建tar.gz文件。

我设法只找到了两个解决方案,这似乎并不是最佳选择:

  1. 将文件“解压缩”,然后将其放入新的“ tar.gz”文件中
  2. 从Python脚本gzip -c example.tar > example.tar.gz调用以下Unix命令

在Python中是否有一种连击方式?

1 个答案:

答案 0 :(得分:2)

tar.gz文件只是经过tar操作的gzip文件。如您所知,您已经编写了以下Unix命令:

gzip -c example.tar > example.tar.gz

如果要在Python中执行相同的操作,只需使用gzip库:

with open('example.tar', 'rb') as inf, gzip.open('example.tar.gz', 'wb') as outf:
    shutil.copyfileobj(inf, outf)

实际上,这直接等同于文档中的Examples of Usage之一。

这是最佳选择吗?

  • 我们要避免使用不粘连的东西。这是非常简单的工作(tar是一种非常简单的格式…),但不是零。
  • 显然,我们必须读取tarball的每个字节,并且您必须写入gzip压缩tarball的每个字节,但是我们要避免一次读取整个文件(这可能会耗尽您的所有RAM)或读取的内容很少在您无法保持磁盘移动的时候。 copyfileobj会为您解决这个问题。

因此,它与gzip工具几乎完全相同。但是我们不是在创建子进程,也不在依赖可能不存在的工具(例如,在Windows或iOS上,或者在某些非常奇怪的情况下,您创建的chroot具有python但没有gzip )。