纯Python 7-zip库
项目描述
py7zr 是一个由Python编程语言编写的库和实用程序,用于支持 7zip 归档的压缩、解压缩、加密和解密。
讨论论坛
您可以在 https://github.com/miurahr/py7zr/discussions 的项目论坛/内置板上加入讨论。
您可以看到新版本发布的公告、问题和答案以及新功能想法。当您在使用 py7zr 库时遇到不明手册,请随时在论坛上提出问题。
压缩算法
py7zr 支持算法和过滤器,这些算法和过滤器在 lzma 模块 和 liblzma 中得到支持,同时支持 Python 核心库中实现的 BZip2 和 Deflate,还支持通过第三方库实现的 ZStandard、Brotli 和 PPMd。
py7zr 还能使用第三方加密库来加密和解密数据。
支持的算法
- 压缩
LZMA2
LZMA
Bzip2
Deflate
复制
ZStandard
Brotli
PPMd
增强 Deflate(实验性)
- 加密
7zAES
- 过滤器
Delta
BCJ(X86,ARMT,ARM,PPC,SPARC,IA64)
不支持算法
BCJ2(标准 lzma 模块 不提供)。
安装
您可以使用 pip 如同安装其他库一样来安装 py7zr。
$ pip install py7zr
或者,可以使用 conda
$ conda install -c conda-forge py7zr
文档
用户手册
开发者指南
贡献指南(本项目)。
贡献指南(html)(本项目)。
行为准则(本项目)。
行为准则(html)(本项目)。
7z 文件规范(py7zr 基于)。
CLI 使用方法
您可以像以下这样运行 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=['文件路径'])' 提取单个或选定的文件。注意:如果您只指定文件而不是父目录,则会失败。
import py7zr
import re
filter_pattern = re.compile(r'<your/target/file_and_directories/regex/expression>')
with py7zr.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_filters) as archive:
archive.writeall('/path/to/base_dir', 'base')
shutil 辅助工具
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 使用 Python 3 标准的 lzma 模块 进行解压缩和压缩。标准的 lzma 模块使用 liblzma,它支持 7zip 的核心压缩算法。
最低要求版本为 Python 3.8。
py7zr 已在 Linux、macOS、Windows 和 Ubuntu aarch64 上进行测试。
希望它也能在 M1 Mac 上运行。
推荐版本是
CPython 3.8.0 及以后版本。
PyPy3.8-7.3.8 及以后版本。
以下修复包含在这些版本中,而在 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 加密 |
|
ZStandard 压缩 |
|
PPMd 压缩 |
|
Brotli 压缩(CPython) |
|
Brotli 压缩(PyPy) |
|
增强的 deflate 压缩 |
|
BCJ 过滤器 |
|
多卷存档读写 |
|
CLI 格式化器 |
性能
您可以在 [Github 问题和](wiki 页面) 找到压缩和解压缩基准测试结果。
py7zr 运行良好,但速度慢于 7-zip 和 p7zip 的 C/C++ 实现,原因有几个。当压缩/解压缩 速度 很重要时,建议通过 subprocess.run Python 接口使用这些替代方案。
py7zr 在解压缩和压缩数据时需要消耗一些内存。它至少需要 300MiB - 700MiB 的空闲内存才能良好工作。
用例
aqtinstall 另一个(非官方)的多平台 Qt (aqt) CLI 安装程序。
PreNLP 自然语言处理预处理库
mlox 用于排序和分析 Morrowind 插件加载顺序的工具
安全
请参阅此项目的 安全策略。
版本 0.20.0、0.19.0、0.18.10 或之前的版本存在针对路径遍历攻击的 漏洞。详细信息请参阅“CVE-2022-44900:py7zr 中的路径遍历漏洞” 披露文章。
受影响的版本由于“py7zr.py”和“helpers.py”文件中检查不足,易受目录遍历攻击。
建议您立即升级到版本 0.20.2 或更高版本
我非常感谢 Matteo Cosentino 先生在安全改进方面的通知和合作。
许可协议
版权(C)2019-2024 Hiroshi Miura
pylzma 版权(c)2004-2015 Joachim Bauch
7-Zip 版权(C)1999-2010 Igor Pavlov
LZMA SDK 版权(C)1999-2010 Igor Pavlov
此库是免费软件;您可以按照自由软件基金会发布的 GNU 较小通用公共许可证的条款重新分发和/或修改它;许可证的第 2.1 版,或(根据您的选择)许可证的任何后续版本。
此库的发行旨在使其有用,但没有任何保证;甚至没有对适销性或特定用途的适用性的暗示保证。有关更多信息,请参阅 GNU 较小通用公共许可证。
您应该已经收到了与这个库一起的GNU通用公共许可证副本;如果没有,请写信给自由软件基金会,公司地址:美国马萨诸塞州波士顿市富兰克林街51号,第5层,邮编02110-1301。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。