【问题标题】:Python: how to create tar file and compress it on the fly with external module, using different compression methods not available in tarfile module?Python:如何使用 tarfile 模块中不可用的不同压缩方法创建 tar 文件并使用外部模块即时压缩它?
【发布时间】:2015-08-30 13:17:31
【问题描述】:

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

【问题讨论】:

  • 不幸的是,没有。该问题涵盖了 tarfile 模块本身可用的标准压缩方法。我试图了解如何使用 tarfile 模块中不可用的一些方法即时压缩 tar 文件。我已经编辑了我的问题的标题,使其更加清晰。谢谢。
  • 好的,在这种情况下,这是真正的问题。问题已取消标记...
  • 嗯,但 GNU tar 只识别 gz 和 bz2。我了解 lz4 在速度方面更好,但您正在创建不兼容的存档。
  • @KenjiNoguchi ,不确定我是否理解您的意思。据我所知,在类 unix 系统中,tar 传统上一直被用作将文件保存在一个文件中的容器——无论您是否使用内置压缩。如果您将未压缩的 tar 打包到 lz4 中,您始终可以通过 lz4 解压缩它,然后只需通过 tar 解压缩生成的文件。谢谢!

标签: python compression tar tarfile


【解决方案1】:

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

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

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

反向操作也是可以的:

lz4 -d mypack.tar.lz4 | tar xv

【讨论】:

    【解决方案2】:

    根据我们上面的对话。

    import tarfile
    import subprocess
    
    p = subprocess.Popen(['lz4', '-'], stdin=subprocess.PIPE)
    
    tar = tarfile.open(fileobj=p.stdin, mode="w|")
    

    从那里你可以做通常的tar.addfile。仅供参考:正如我在谈话中所说的那样。 GNU tar 可以自动检测 gz 和 bz2 但不能自动检测 lz4。只是一个注释。所以你必须做lz4 -c -d stdin.lz4 | tar xf - 来提取文件。如果你只是做tar xf,它会失败。

    【讨论】:

    • 很遗憾,我还不能投票,但非常感谢您的帮助。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2019-06-14
    相关资源
    最近更新 更多