跳转到主要内容

纯Python 7-zip库

项目描述

https://readthedocs.org/projects/py7zr/badge/?version=latest https://badge.fury.io/py/py7zr.svg https://img.shields.io/pypi/dd/py7zr https://img.shields.io/conda/vn/conda-forge/py7zr https://github.com/miurahr/py7zr/workflows/Run%20Tox%20tests/badge.svg https://dev.azure.com/miurahr/github/_apis/build/status/miurahr.py7zr?branchName=master https://coveralls.io/repos/github/miurahr/py7zr/badge.svg?branch=master https://img.shields.io/pypi/l/py7zr https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg py7zr

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)

不支持算法

安装

您可以使用 pip 如同安装其他库一样来安装 py7zr。

$ pip install py7zr

或者,可以使用 conda

$ conda install -c conda-forge 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 表达式。

用途

PyCryptodomex

7zAES 加密

PyZstd

ZStandard 压缩

PyPPMd

PPMd 压缩

Brotli

Brotli 压缩(CPython)

BrotliCFFI

Brotli 压缩(PyPy)

inflate64

增强的 deflate 压缩

pybcj

BCJ 过滤器

multivolumefile

多卷存档读写

texttable

CLI 格式化器

性能

您可以在 [Github 问题和](wiki 页面) 找到压缩和解压缩基准测试结果。

py7zr 运行良好,但速度慢于 7-zipp7zip 的 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。

项目详情


发布历史 发布通知 | RSS订阅

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源代码分发

py7zr-0.22.0.tar.gz (5.0 MB 查看哈希值)

上传时间 源代码

构建分发

py7zr-0.22.0-py3-none-any.whl (67.9 kB 查看哈希值)

上传时间 Python 3

由以下支持