Python3:lzma unpack .7z文件

Sjo*_*888 15 7zip python-3.x

我想解压缩一个.7z文件.根据这个问题,我可以使用 lzma包来做到这一点.

我期待着类似的东西

import lzma
#...
with lzma.open('myFile.7z') as f:
    f.extractall('.')
Run Code Online (Sandbox Code Playgroud)

要将文件解压缩到当前目录中,但似乎不存在这样的事情.尝试类似的东西

import lzma
#...
with lzma.open('myFile.7z') as f:
    file_content = f.read()
    print(file_content)
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*cus 21

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' )
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:libarchive具有python的绑定。我已经能够使用libarchive提取7z文件。如果此功能在我尚未测试的python绑定中可用。但是值得一试。 (3认同)

Zho*_*gbo 9

您可以尝试使用 python 库py7zr,它支持 7zip 存档压缩、解压、加密、解密。https://github.com/miurahr/py7zr

import py7zr
with py7zr.SevenZipFile('sample.7z', mode='r') as z:
    z.extractall()
Run Code Online (Sandbox Code Playgroud)


a.t*_*.t. 7

该解决方案的功劳归于Matt Dnv 的回答

我无法使给出的答案发挥作用。大多数在 python 中解压 7z 文件的解决方案都使用 7zip,但我无法找到可以使用 curl 的可靠的便携式版本。

.7z因此,这里有一个在 Anaconda 提示符 4.8.2 中在 python 3.6 环境中解压文件的解决方案。首先我必须安装 2 个软件包:

pip install pyunpack
pip install patool
Run Code Online (Sandbox Code Playgroud)

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

from pyunpack import Archive
Archive('test.7z').extractall('./output')
Run Code Online (Sandbox Code Playgroud)