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

Ave*_*nus 3 python compression lzma python-3.x 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)
Run Code Online (Sandbox Code Playgroud)

最近,我获得了带有.xz(不是.tar.xz)和.zst扩展名的文件的列表。我较差的研究技能告诉我,前者是lzma2压缩,后者是压缩Zstandard

但是,我找不到将这些档案的内容解压缩到一个文件夹中的简单方法(就像我对这些文件所做的那样.bz2)。

我怎么能够:

  1. 使用Python 3 将.xzlzma2)文件的内容解压缩到文件夹中吗?
  2. 使用Python 3 将.zstZstandard)文件的内容解压缩到文件夹中吗?

重要说明:我正在解压缩非常大的文件,因此,如果该解决方案考虑到任何潜在的Memory Errors,那就太好了。

Mar*_*ers 6

可以使用lzma模块解压缩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)
Run Code Online (Sandbox Code Playgroud)

Python标准库尚未对Zstandard压缩提供任何支持,您可以使用zstandard(由Mozilla和Mercurial项目提供的IndyGreg)或zstd; 后者可能对于您的需求来说太基础了,而它zstandard提供了专门适合读取文件的流API。

我在zstandard这里使用该库来受益于它实现的复制API,该API使您可以同时解压缩和复制,类似于shutil.copyfileobj()工作方式:

import zstandard
import pathlib
import shutil

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)
Run Code Online (Sandbox Code Playgroud)