Python:如何使用外部模块在创建tar文件并压缩时实现即时压缩,使用不在tarfile模块中提供的不同压缩方法?

3
我正在尝试设置一个代码,将几个大文件(从数十到数百GB)打包成一个归档文件。Tarfile模块支持的压缩方法对于这么多数据来说有点慢,所以我想使用一些外部压缩模块,比如lz4,以实现更快的压缩速度。不幸的是,我找不到一种方法,在创建临时tar文件之前流式传输tar文件并用lz4进行压缩。Tarfile模块的文档说明有一种方式可以使用“w|”模式打开未压缩的写入流。那么,这是直接将tar文件流传输到lz4模块的方法吗?如果是,正确的使用方法是什么?非常感谢。

可能是如何使用Python创建完整压缩的tar文件?的重复问题。 - Aditya
很遗憾,不行。那个问题涵盖了tarfile模块中可用的标准压缩方法。我正在尝试理解如何使用一些在tarfile模块中不可用的方法即时压缩tar文件。我已编辑我的问题标题使其更加清晰。谢谢。 - Trevor_Numbers
嗯,但GNU tar只识别gz和bz2格式。我知道lz4在速度方面更好,但你正在创建不兼容的存档文件。 - Kenji Noguchi
@KenjiNoguchi,不确定我是否理解了你的意思。据我所知,在类Unix系统中,tar传统上只用作容器,将文件组合在一个文件中 - 不管您是否使用内置压缩。如果您将未压缩的tar打包到lz4中,您始终可以通过lz4解压缩它,然后通过tar解压缩生成的文件。谢谢! - Trevor_Numbers
好的,明白了。我自己没有尝试过,但我认为你可以打开一个文件流到lz4命令,并将文件对象传递给tarfile.open函数。 - Kenji Noguchi
显示剩余4条评论
2个回答

5
根据我们之前的对话。
import tarfile
import subprocess

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

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

从那里,您可以执行通常的tar.addfile操作。FYI:如我在对话中所述,GNU tar可以自动检测gz和bz2,但不能检测lz4。只是一个注释。因此,您需要执行lz4 -c -d stdin.lz4 | tar xf -来提取文件。如果仅使用tar xf会失败。


很遗憾我还不能投票,但是您的帮助非常感谢。非常感谢您。 - Trevor_Numbers

1
您可以将tar命令的结果直接传输到lz4实用程序中。这将避免使用任何中间文件。这是一个例子(假设您的系统上都安装了tarlz4):

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

这里的-表示将结果从tar输出到stdout。当然,您可以将*更改为您想要打包的任何目标。

反向操作也是可能的:

lz4 -d mypack.tar.lz4 | tar xv


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接