python - 如何使用 Python 3 将 lzma2 (.xz) 和 zstd (.zst) 文件解压缩到文件夹中?
问题描述
我一直在处理文件很长时间.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
(not .tar.xz
) 和.zst
扩展名的文件列表。我糟糕的研究技能告诉我,前者是lzma2
压缩,后者是Zstandard
。
但是,我找不到将这些档案的内容解压缩到文件夹中的简单方法(就像我对.bz2
文件所做的那样)。
我怎样才能:
- 使用 Python 3将
.xz
( ) 文件的内容解压到文件夹中?lzma2
- 使用 Python 3将
.zst
( ) 文件的内容解压缩到文件夹中?Zstandard
重要提示:我正在解压缩非常大的文件,因此如果解决方案考虑到任何潜在的内存错误,那就太好了。
解决方案
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)
Python 标准库尚不支持 Zstandard 压缩,您可以使用zstandard
(来自 Mozilla 的 IndyGreg 和 Mercurial 项目)或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 - 如何在 QMenuBar 中移动项目(菜单)?
- operating-system - 在 AUTOSAR 中进行硬复位和软复位后 OS 和 ECUM 的行为
- r - 删除行的大部分值为零
- java - EC2 实例 - 将 STDOUT 日志发送到 Cloud Watch
- apache-spark - Spark 中的 accumulator 和 collect() 之间的性能差异是什么?
- mongodb - 如何将 Mongo DB 查询转换为 Mongoengine
- java - 如何在java中更改操作系统时区?
- docker - Dockerfile 用于创建一个图像以在 jenkins 中用作容器代理
- linux - Docker 19.03 中是否有用于访问 docker buildx 的 HTTP api?
- ios - 为什么我的 IBAction 出现“无法识别的选择器”错误?