Python:如何创建tar文件并使用外部模块动态压缩它,使用tarfile模块中不可用的不同压缩方法?

Python:如何创建tar文件并使用外部模块动态压缩它,使用tarfile模块中不可用的不同压缩方法?,python,compression,tar,tarfile,Python,Compression,Tar,Tarfile,我正在尝试设置一个代码,将几个大文件(从几十GB到数百GB)打包到一个归档文件中。tarfile模块中支持的压缩方法对于如此大的数据量来说有点慢,因此我想使用一些外部压缩模块,如lz4,以获得更好的压缩速度。不幸的是,我找不到一种方法来创建tar文件并用lz4动态压缩它,以避免创建临时tar文件。tarfile模块的文档中说,有一种方法可以打开一个未压缩的流,以便使用“w |”模式进行写入。这是将tar文件直接流式传输到lz4模块的方法吗?如果是,正确的使用方法是什么?非常感谢。根据我们上面的对

我正在尝试设置一个代码,将几个大文件(从几十GB到数百GB)打包到一个归档文件中。tarfile模块中支持的压缩方法对于如此大的数据量来说有点慢,因此我想使用一些外部压缩模块,如lz4,以获得更好的压缩速度。不幸的是,我找不到一种方法来创建tar文件并用lz4动态压缩它,以避免创建临时tar文件。tarfile模块的文档中说,有一种方法可以打开一个未压缩的流,以便使用“w |”模式进行写入。这是将tar文件直接流式传输到lz4模块的方法吗?如果是,正确的使用方法是什么?非常感谢。

根据我们上面的对话

import tarfile
import subprocess

p = subprocess.Popen(['lz4', '-'], stdin=subprocess.PIPE)

tar = tarfile.open(fileobj=p.stdin, mode="w|")

从那里您可以执行常规的
tar.addfile
。仅供参考:正如我在对话中所说的。GNUTAR可以自动检测gz和bz2,但不能检测lz4。只是一张纸条。因此,您必须执行
lz4-c-dstdin.lz4 | tar xf-
来提取文件。如果只是执行了
tar xf
,它将失败。

您可以通过管道将
tar
命令的结果直接传输到
lz4
实用程序。这将避免使用任何中间文件。下面是一个示例(假设您的系统上同时安装了
tar
lz4
):

tar cvf-*|lz4>mypack.tar.lz4

此处的
-
指示将结果从
tar
输出到
stdout
。当然,您可以更改
*
,选择您想要的目标

也可以进行反向操作:

lz4-d mypack.tar.lz4 | tar xv

不幸的是,没有。这个问题涉及tarfile模块本身可用的标准压缩方法。我试图理解如何使用tarfile模块中不可用的方法动态压缩tar文件。我编辑了我问题的标题,让它更清楚一点。谢谢。好吧,那才是真正的问题。问题已经解决了…嗯,但GNU tar只识别gz和bz2。我知道lz4在速度上更好,但你正在创建不兼容的归档文件。@KenjiNoguchi,不确定我是否理解你的意思。据我所知,在类unix系统中,传统上,tar被用作将文件保存在一个文件中的容器,无论您是否使用内置压缩。如果将未压缩的tar打包到lz4中,则始终可以通过lz4将其解压缩,然后通过tar将生成的文件解压缩。谢谢很遗憾,我还不能投票,但非常感谢你的帮助。非常感谢你。