如何使用 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 文件。
我设法只找到了两个解决方案,这似乎不是最佳解决方案:
- "un-tar" 文件,然后将它们放入一个新的 "tar.gz" 文件
- 从 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。
我有一个 tar 文件,其结构如下:
example.tar
--file1
--file2
我想将文件另存为 tar.gz,所以它看起来像:
example.tar.gz
--file1
--file2
我尝试在 tarfile
模块中使用 TarFile.add()
,但我只能创建具有另一个层次结构的 tar.gz 文件。
我设法只找到了两个解决方案,这似乎不是最佳解决方案:
- "un-tar" 文件,然后将它们放入一个新的 "tar.gz" 文件
- 从 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。