Python3:lzma unpack .7z文件

时间:2015-07-31 09:46:09

标签: python-3.x 7zip

我想解压缩.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解决方案。

3 个答案:

答案 0 :(得分:17)

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

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

另一方面,7z是archive file format,这意味着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年(可能更早),python的libarchive bindings支持7z格式。上面的链接中给出了从7z存档中提取文件的示例。

答案 1 :(得分:3)

您可以尝试使用Python库py7zr代替,该库支持7zip存档压缩,解压缩,加密和解密。 https://github.com/miurahr/py7zr

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

答案 2 :(得分:1)

此解决方案的信用转到Matt Dnv in this answer

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

因此,这里是在Anaconda提示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')