我想解压缩.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解决方案。
答案 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' )
由于有兴趣在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')