为什么Python不能使用zip方法解压Winrar创建的密码保护zip文件?

11

我在网上搜索了很久,但仍然找不到解决上述问题的方法。有人知道为什么吗?如果知道,能告诉我如何解决吗?

psw="dg"

ZipFile.extractall("data.zip", None, psw)

我遇到的错误:

TypeError: unbound method extractall() must be called
with ZipFile instance as first argument (got str instance instead)

1
文档在此处:https://docs.python.org/2/library/zipfile.html,请参阅ZipFile.open(name [,mode [,pwd]]) - Stefan
谢谢您的回复,但尽管文档上写着这样,但它并不起作用,我无法在网上找到任何一个例子。 这很奇怪!好像从来没有人使用Python中的zip方法压缩过受密码保护的文件,如果他们确实这样做了,也从未提及过! - wookie
实际上,@Stefan 给了你完全正确的链接。 :) 你没有正确阅读文档,这就是问题所在。请看下面我的回答。 - Bruno Gelb
3个回答

34
因为你使用方法不正确。 :) 参考文档:

ZipFile.extractall([path[, members[, pwd]]])

将zip文件中的所有成员解压到当前工作目录。path参数指定一个不同的目录来进行提取。members参数是可选的,并且必须是namelist()返回列表的子集。pwd参数是用于加密文件的密码。

所以你应该对ZipFile对象调用该函数,而不是作为静态方法调用。并且你不应该将存档名称作为第一个参数传递。 :) 这样做就可以了:
from zipfile import ZipFile

with ZipFile('data.zip') as zf:
    zf.extractall(pwd='dg')

编辑,在更新的版本中使用:

zf.extractall(pwd=b'dg')

谢谢,上述方法可行,我接受了你的答案。但是我注意到extractall方法花费了相当长的时间才完成。确切地说,大约需要5分钟的时间。我压缩了8个文件,包括bmp、png、jpeg、wav、ogg和mp3,总大小为10.7Mb。为什么会这样呢?在这么小的文件大小上等待如此之久,我想了解更多信息。 :) - wookie
4
回答@wookie提出的一个老问题,即为什么ZipFile这么慢:文档说明了“解密非常慢,因为它是使用本地Python而不是C实现的。” - Klox
6
实际上,它的意思是使用密码"dg"来提取文件。 - Larry Song
1
@LarrySong 感谢提到 b。这是正确的方式。 - nainometer

4
为了提供没有缩写的确切语法:
from zipfile import ZipFile

str_zipFile = 'FileZip.zip'
str_pwd= 'xxxx'

with ZipFile(str_zipFile) as zipObj:
  zipObj.extractall(pwd = bytes(str_pwd,'utf-8'))

0

有些文件的来源不明,并且提取时间很长。

例如,如果已经提取了60秒或者时间已经过去,我想删除原始文件以取消操作。

import pyzipper

with pyzipper.AESZipFile('test.zip', 'r', compression=pyzipper.ZIP_LZMA, encryption=pyzipper.WZ_AES) as extracted_zip:
        extracted_zip.extractall(pwd=str.encode("@apkclub"))
        os.remove(test.zip)

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