python - 如何使用 Python 3 将 lzma2 (.xz) 和 zstd (.zst) 文件解压到一个文件夹中?

标签 python python-3.x compression lzma zstandard

我已经使用 .bz2 文件工作了很长时间。要将 .bz2 文件解压缩/解压缩到特定文件夹中,我一直在使用以下函数:

destination_folder = 'unpacked/'
def decompress_bz2_to_folder(input_file):
    unpackedfile = bz2.BZ2File(input_file)
    data = unpackedfile.read()
    open(destination_folder, 'wb').write(data)

最近我获得了一个文件列表,其中包含 .xz(不是 .tar.xz)和 .zst 扩展名。我可怜的研究技能告诉我,前者是 lzma2 压缩,后者是 Zstandard

但是,我找不到将这些存档的内容解压缩到文件夹中的简单方法(就像我处理 .bz2 文件一样)。

我怎样才能:

  1. .xz (lzma2) 文件的内容解压到一个文件夹中,使用 python 3?
  2. 使用 Python 3 将 .zst (Zstandard) 文件的内容解压到一个文件夹中?

重要提示:我正在打开包装 very large files ,所以如果解决方案考虑到任何潜在的内存错误,那就太好了。

最佳答案

可以使用 lzma module 解压缩 LZMA 数据,只需用该模块打开文件,然后使用 shutil.copyfileobj()有效地将解压缩的数据复制到输出文件而不会遇到内存问题:

import lzma
import pathlib
import shutil

def decompress_lzma_to_folder(input_file):
    input_file = pathlib.Path(input_file)
    with lzma.open(input_file) as compressed:
        output_path = pathlib.Path(destination_dir) / input_file.stem
        with open(output_path, 'wb') as destination:
            shutil.copyfileobj(compressed, destination)
        

Python 标准库尚不支持 Zstandard 压缩,您可以使用 zstandard (来自 Mozilla 和 Mercurial 项目的 IndyGreg)或 zstd ;后者可能对您的需求来说太基础了,而 zstandard 提供了一个特别适合读取文件的流式 API。

我在这里使用 zstandard 库来受益于它实现的复制 API,它允许您同时解压缩和复制,类似于 shutil.copyfileobj() 有效:

import zstandard
import pathlib

def decompress_zstandard_to_folder(input_file):
    input_file = pathlib.Path(input_file)
    with open(input_file, 'rb') as compressed:
        decomp = zstandard.ZstdDecompressor()
        output_path = pathlib.Path(destination_dir) / input_file.stem
        with open(output_path, 'wb') as destination:
            decomp.copy_stream(compressed, destination)

关于python - 如何使用 Python 3 将 lzma2 (.xz) 和 zstd (.zst) 文件解压到一个文件夹中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55184290/

相关文章:

css - 优化(删除冗余和合并)CSS 的工具?

python - matplotlib生成的PDF无法在acrobat reader中查看

python - 将 map 坐标转换为纬度/经度

python - 对于相同大小的列表,为什么深复制比浅复制慢得多?

Python-docx 无法使用现有文档 - 没有名称为 'Title' 的样式

image-processing - OpenCV imwrite 增加png图像的大小

python - python 范围如何在此代码段中工作?

python - 对列表中的奇数进行排序

python - 如何使用 Selenium 查找仅在滚动后才可用的元素?

java - 如何在 Java 中正确实现 LZ4、Snappy 或等效的压缩技术?