Python3: lzma 解压 .7z 文件

Python3: lzma unpack .7z file

我想解压一个 .7z 文件。根据这个 question 我可以使用 lzma 执行此操作的包。

我期待的是

import lzma
#...
with lzma.open('myFile.7z') as f:
    f.extractall('.')

要将文件解压到当前目录,但好像不存在这样的东西。此外尝试像

import lzma
#...
with lzma.open('myFile.7z') as f:
    file_content = f.read()
    print(file_content)

确实产生了 _lzma.LZMAError: Input format not supported by decoder。如何检查格式?我很惊讶,因为我认为 7zip 和 .7z 格式都是开源的,python 应该支持所有内容。

我看到很多答案,人们只是用子进程调用 7zip 可执行文件,但这不是我想要做的。我正在寻找一个简单的 python3 解决方案。

LZMA 和 7z 是两个非常不同的野兽。

用最简单的术语来说,LZMA 是一种 lossless compression 算法。这意味着,您向 LZMA 提供一些数据,它会压缩并为您提供输出。它没有文件、文件夹或如何存储它们的意义。

另一方面,

7z 是一个 archive file format,这意味着 7z 是一个完整的包。您有几个文件和文件夹,将其提供给 7z,它会整齐地压缩它们,并将它们存储在一个文件(存档)中。请注意,7z 使用 LZMA 和其他算法的混合物来压缩文件并将其存储在其 7z 存档文件中。

以下是维基百科对这两者的评价:

7z is a compressed archive file format that supports several different data compression, encryption and pre-processing algorithms.

The Lempel–Ziv–Markov chain algorithm (LZMA) is an algorithm used to perform lossless data compression. It has been under development either since 1996 or 19983 and was first used in the 7z format of the 7-Zip archiver.

所以简而言之,您不能使用 lzma 来创建或提取 7z 文件。据我所知,没有其他方法可以使用 python 提取 7z 文件: 请参阅下面的更新。

import os
os.system( '7z x archive.7z -oPath/to/Name' )

更新:2019 年 5 月

因为有人对提取 python 中的 7z 文件感兴趣,所以我认为需要更新。截至 2019 年(可能更早),libarchive bindings for python 确实支持 7z 格式。 link.

中给出了从 7z 存档中提取文件的示例

您可以尝试使用 python 库,py7zr, which supports 7zip archive compression, decompression, encryption, decryption. https://github.com/miurahr/py7zr

import py7zr
with py7zr.SevenZipFile('sample.7z', mode='r') as z:
    z.extractall()

此解决方案的来源转至 Matt Dnv in this answer:

我无法使给定的答案有效。在 python 中解压 7z 文件的大多数解决方案都使用 7zip,我无法找到可以卷曲的可靠便携式版本。

因此,这是在 Anaconda prompt 4.8.2 的 python 3.6 环境中解压 .7z 文件的解决方案。首先我必须安装 2 个包:

pip install pyunpack
pip install patool

接下来我能够解压一个名为 test.7z 的 7zip 文件,它位于与这个 example.py 脚本相同的目录中,到一个名为:output 的文件夹(也位于与此 example.py 脚本相同的目录)。解压test.7z文件的代码可以是:

from pyunpack import Archive
Archive('test.7z').extractall('./output')