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

How to save tar file in flat tar.gz using Python

我有一个 tar 文件,其结构如下:

example.tar
--file1
--file2

我想将文件另存为 tar.gz,所以它看起来像:

example.tar.gz
--file1
--file2

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

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

  1. "un-tar" 文件,然后将它们放入一个新的 "tar.gz" 文件
  2. 从 Python 脚本调用以下 Unix 命令 gzip -c example.tar > example.tar.gz

Python有更好的方法吗?

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 压缩包的每个字节,但我们希望避免一次读取整个文件(这可能会耗尽您的所有 RAM)或读取一次太少以至于您无法保持磁盘移动。 copyfileobj 会为您处理。

因此,它与 gzip 工具所做的工作几乎完全相同。但是我们不是在创建子进程,我们也不依赖于可能不存在的工具(例如,在 Windows 或 iOS 上,或者在您创建的一些非常奇怪的场景中具有 python 但没有 gzip 的 chroot。