纯python 7-zip库
项目描述
py7zr 是一个支持 7zip 压缩包、解压、加密和解密的库和实用程序,由 Python 编程语言编写。
压缩算法
py7zr支持lzma 模块和liblzma支持的算法和过滤器,并支持在 python 核心库中实现的 BZip2 和 Deflate,它还支持 ZStandard、Brotli 和 PPMd 与第三方库。
py7zr还能够使用 3rd 方加密库加密和解密数据。
支持的算法
- 压缩
LZMA2
LZMA
压缩包
放气
复制
Z标准
布罗特利
增强的放气(实验性)
PPMd(实验性)
- 地穴
7zAES
- 过滤器
三角洲
BCJ(X86,ARMT,ARM,PPC,SPARC,IA64)
不支持的算法
BCJ2(标准lzma 模块不提供)。
安装
您可以像往常一样使用 pip 安装 py7zr 其他库。
$ pip install py7zr
或者,或者使用 conda:
$ conda install -c conda-forge py7zr
文件
用户手册
开发者指南
命令行使用
您可以运行命令脚本 py7zr,如下所示;
列出存档内容
$ py7zr l test.7z
提取档案
$ py7zr x test.7z
使用密码提取存档
$ py7zr x -P test.7z
password?: ****
创建并压缩到存档
$ py7zr c target.7z test_dir
创建多卷存档
$ py7zr c -v 500k target.7z test_dir
测试存档
$ py7zr t test.7z
将文件附加到存档
$ py7zr a test.7z test_dir
显示信息
$ py7zr i
显示版本
$ py7zr --version
SevenZipFile 类用法
py7zr 是一个可以在你的 python 应用程序中使用的库。
解压/解密
这是一个代码片段,如何解压缩应用程序中的某些文件。
import py7zr
archive = py7zr.SevenZipFile('sample.7z', mode='r')
archive.extractall(path="/tmp")
archive.close()
您也可以使用 'with' 块,因为 py7zr 提供上下文管理器(v0.6 及更高版本)。
import py7zr
with py7zr.SevenZipFile('sample.7z', mode='r') as z:
z.extractall()
with py7zr.SevenZipFile('target.7z', 'w') as z:
z.writeall('./base_dir')
py7zr还支持通过 'extract(targets=['file path'])' 提取单个或选定文件。注意:如果只指定一个文件而不指定父目录,它将失败。
import py7zr
import re
filter_pattern = re.compile(r'<your/target/file_and_directories/regex/expression>')
with SevenZipFile('archive.7z', 'r') as archive:
allfiles = archive.getnames()
selective_files = [f for f in allfiles if filter_pattern.match(f)]
archive.extract(targets=selective_files)
py7zr 支持提取受密码保护的存档。(v0.6 及更高版本)
import py7zr
with py7zr.SevenZipFile('encrypted.7z', mode='r', password='secret') as z:
z.extractall()
压缩/加密
这是如何生成存档的代码片段。
import py7zr
with py7zr.SevenZipFile('target.7z', 'w') as archive:
archive.writeall('/path/to/base_dir', 'base')
要创建加密存档,请输入密码。
import py7zr
with py7zr.SevenZipFile('target.7z', 'w', password='secret') as archive:
archive.writeall('/path/to/base_dir', 'base')
要使用 zstandard 等算法创建存档,您可以使用自定义过滤器调用。
import py7zr
my_filters = [{"id": py7zr.FILTER_ZSTD}]
another_filters = [{"id": py7zr.FILTER_ARM}, {"id": py7zr.FILTER_LZMA2, "preset": 7}]
with py7zr.SevenZipFile('target.7z', 'w', filters=my_filter) as archive:
archive.writeall('/path/to/base_dir', 'base')
小助手
py7zr 也支持shutil 接口。
from py7zr import pack_7zarchive, unpack_7zarchive
import shutil
# register file format at first.
shutil.register_archive_format('7zip', pack_7zarchive, description='7zip archive')
shutil.register_unpack_format('7zip', ['.7z'], unpack_7zarchive)
# extraction
shutil.unpack_archive('test.7z', '/tmp')
# compression
shutil.make_archive('target', '7zip', 'src')
要求
py7zr使用 python3 标准lzma 模块进行提取和压缩。标准 lzma 模块使用支持 7zip 核心压缩算法的liblzma。
最低要求版本是 Python 3.7。
py7zr在 Linux、macOS、Windows 和 Ubuntu aarch64 上进行了测试。
它也有望在 M1 Mac 上运行。
推荐的版本是:
CPython 3.7.5、CPython 3.8.0 及更高版本。
PyPy3.6-7.3.2 及更高版本。
这些版本中包含以下修复,在 python3.6 上未修复。
BPO-21872:LZMA 库有时无法解压缩文件
PyPy3-3090:lzma.LZMADecomporessor.decompress 不尊重 max_length
PyPy3-3242:“_lzma_cffi”没有名为“lzma_stream_encoder”的函数
CPython 3.10 中包含以下改进
BPO-41486:通过新的输出缓冲更快的 bz2/lzma/zlib
依赖项
有几个依赖项来支持算法和 CLI 表达式。
包裹 |
目的 |
|---|---|
7zAES加密 |
|
Z标准压缩 |
|
PPMd 压缩 |
|
Brotli 压缩 (CPython) |
|
Brotli 压缩 (PyPy) |
|
增强的放气压缩 |
|
BCJ 过滤器 |
|
多卷存档读/写 |
|
CLI 格式化程序 |
表现
您可以在 [Github issue]( https://github.com/miurahr/py7zr/issues/297 ) 和 [wiki page]( https://github.com/miurahr/py7zr/wiki /基准)
py7zr 运行良好,但由于几个原因比7-zip和p7zip C/C++ 实现慢。当压缩/解压缩速度很重要时,建议通过subprocess.run python 接口使用这些替代方案。
py7zr 会消耗一些内存来解压和压缩数据。它至少需要大约 300MiB - 700MiB 的可用内存才能正常工作。
用例
aqtinstall多平台上的另一个(非官方)Qt (aqt) CLI 安装程序。
用于自然语言处理的PreNLP预处理库
mlox 用于排序和分析 Morrowind 插件加载顺序的工具
执照
版权所有 (C) 2019-2022 三浦浩
版权所有 (c) 2004-2015 by Joachim Bauch
7-Zip 版权所有 (C) 1999-2010 Igor Pavlov
LZMA SDK 版权所有 (C) 1999-2010 Igor Pavlov
该库是免费软件;您可以根据自由软件基金会发布的 GNU 宽松通用公共许可证的条款重新分发和/或修改它;许可证的 2.1 版,或(由您选择)任何更高版本。
分发这个库是希望它有用,但没有任何保证;甚至没有对适销性或特定用途适用性的默示保证。有关更多详细信息,请参阅 GNU 通用公共许可证。
您应该已经收到了 GNU Lesser General Public License 的副本以及这个库;如果没有,请写信给 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA