我使用.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
文件所做的那样)。
我如何:
.xz
(lzma2
)文件的内容解压缩到文件夹中
Python 3? .zst
(Zstandard
)文件的内容解压缩到文件夹中吗?重要说明::我正在打开very large files的包装,因此,如果该解决方案考虑到任何潜在的 内存错误 ,那将是很好的选择强>。
答案 0 :(得分:4)
可以使用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
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)