Skip to main content

纯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 是一个支持 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)

不支持的算法

安装

您可以像往常一样使用 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 表达式。

包裹

目的

PyCryptodomex

7zAES加密

PyZstd

Z标准压缩

PyPPMd

PPMd 压缩

布罗特利

Brotli 压缩 (CPython)

布罗特利CFFI

Brotli 压缩 (PyPy)

膨胀64

增强的放气压缩

pybcj

BCJ 过滤器

多卷文件

多卷存档读/写

文本表

CLI 格式化程序

表现

您可以在 [Github issue]( https://github.com/miurahr/py7zr/issues/297 ) 和 [wiki page]( https://github.com/miurahr/py7zr/wiki /基准

py7zr 运行良好,但由于几个原因比7-zipp7zip C/C++ 实现慢。当压缩/解压缩速度很重要时,建议通过subprocess.run python 接口使用这些替代方案。

py7zr 会消耗一些内存来解压和压缩数据。它至少需要大约 300MiB - 700MiB 的可用内存才能正常工作。

用例

执照

  • 版权所有 (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