Python3:使用lzma解压缩.7z文件

29
我希望解压一个.7z文件。根据这个问题,我可以使用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的解决方案。

3个回答

34

LZMA和7z是两个非常不同的东西。

简单来说,LZMA是一种无损压缩算法。这意味着,你输入数据到LZMA中,它会将其压缩并输出。它没有文件、文件夹或存储方式的概念。

另一方面,7z是一种归档文件格式,这意味着7z是一个完整的包。你有一些文件和文件夹,将它们输入到7z中,它会将它们整齐地压缩,并将它们存储在一个单独的文件(归档)中。请注意,7z使用LZMA和其他算法的组合来压缩并存储文件在其7z归档文件中。

以下是维基百科对这两者的解释:

7z 是一种压缩的存档文件格式,支持多种不同的数据压缩、加密和预处理算法。
Lempel-Ziv-Markov 链算法 (LZMA) 是用于执行无损数据压缩的算法。它自 1996 或 1998 年以来一直在开发中3,并首次用于 7-Zip 存档程序的 7z 格式。 简而言之,您不能使用 lzma 来创建或提取 7z 文件。据我所知,除了以下方法外,没有其他方法可以使用 Python 提取 7z 文件:请参见下面的更新。
import os
os.system( '7z x archive.7z -oPath/to/Name' )

更新:2019年5月

由于有一些关于在Python中提取7z文件的兴趣,我认为需要进行更新。截至2019年(甚至更早),libarchive绑定支持Python中的7z格式。以上链接提供了从7z存档中提取文件的示例。


4
FYI:libarchive有适用于Python的绑定。 我已经能够使用libarchive提取7z文件。 如果此功能在Python绑定中可用,则我尚未测试。 但是值得一试。 - Marcus
没有适用于Windows的PyPi软件包。 - nmz787

8

你可以尝试使用一个Python库 py7zr,它支持7zip归档的压缩、解压缩、加密和解密。https://github.com/miurahr/py7zr

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

7
这个解决方案的功劳归于Matt Dnv在这个答案中提供的方法:
我没能让之前给出的解决方案生效。大多数用Python解压7z文件的解决方案都使用7zip,但我找不到可靠的可移植版本供我下载。
所以这里是一个解决方案,可以在Anaconda prompt 4.8.2中的Python 3.6环境下解压缩.7z文件。首先,我必须安装两个软件包:
pip install pyunpack
pip install patool

接下来,我成功解压了一个名为 test.7z 的文件,它位于与此 example.py 脚本相同的目录中,并将其解压到名为 output 的文件夹中(也位于与此 example.py 脚本相同的目录中)。解压 test.7z 文件的代码如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接