python - 如何使用 Python 将 tar 文件保存在平面 tar.gz 中
问题描述
我有一个具有以下结构的 tar 文件:
example.tar
--file1
--file2
我想将文件保存为 tar.gz,所以它看起来像:
example.tar.gz
--file1
--file2
我尝试TarFile.add()
在tarfile
模块中使用,但我只设法创建具有另一个层次结构的 tar.gz 文件。
我设法只找到了两个解决方案,这似乎不是最佳的:
- “解压缩”文件,然后将它们放入新的“tar.gz”文件中
- 从 Python 脚本调用以下 Unix 命令
gzip -c example.tar > example.tar.gz
在 Python 中有没有更好的方法?
解决方案
tar.gz
文件只是tar
被gzip
ped的文件。鉴于您编写了这个 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)
事实上,这直接等同于文档中的使用示例之一。
这是最优的吗?
- 我们正在避免去焦油和涂焦油的部分。这是非常少的工作(
tar
是一种非常简单的格式......),但不是零。 - 我们显然必须读取 tarball 的每个字节,并且您必须写入 gzip 压缩的 tarball 的每个字节,但我们希望避免一次读取整个文件(这可能会耗尽您的所有 RAM)或一次读取这么少你不能保持磁盘移动。
copyfileobj
为你处理好。
gzip
因此,它与该工具所做的工作几乎完全相同。但是我们没有创建子进程,也没有依赖可能不存在的工具(例如,在 Windows 或 iOS 上,或者在某些非常奇怪的场景中,您创建了一个具有 python 但没有 gzip 的 chroot )。
推荐阅读
- javascript - 是否有可能获得其他机器人的正常运行时间?
- bash - 我的 Bash Shell 脚本中的时间戳变量在日志文件中没有更改
- java - ArrayIndexOutOfBoundsException,我正在努力寻找原因?
- python-3.x - BeautifulSoup4 返回 None 尽管标签存在
- c - 如何确定使用C语言在终端中输入的参数的值
- python - 无法在 Kivy (Python) 中禁用按钮
- go - 上传到互联网站点
- qt - 为什么将文档打印到 PDF 会崩溃?
- r - 在R中计算2次之间的营业时间
- qt - 如何避免 QStackedLayout 中包含隐藏的 QWidget 高度?