为啥python不能解压由winrar使用zip方法创建的受密码保护的zip文件?
Posted
技术标签:
【中文标题】为啥python不能解压由winrar使用zip方法创建的受密码保护的zip文件?【英文标题】:why can't python unzip a password protected zip file created by winrar using the zip method?为什么python不能解压由winrar使用zip方法创建的受密码保护的zip文件? 【发布时间】:2014-08-16 04:10:41 【问题描述】:我在网上到处搜索,但仍然找不到上述问题的解决方案。有没有人知道为什么,如果可以,怎么做?
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)
【问题讨论】:
此处的文档:docs.python.org/2/library/zipfile.html,参见 ZipFile.open(name[, mode[, pwd]]) 感谢您的回复,但尽管文档说明了这一点,但它并不能那样工作,而且我在网络上的任何地方都找不到单个示例。它很奇怪!就好像没有人使用 python 中的 zip 方法压缩受密码保护的文件,如果他们从未谈论过它! 实际上,@Stefan 为您提供了完全正确的链接。 :) 您没有正确阅读文档,这就是问题所在。请看下面我的回答。 【参考方案1】:因为你用错了。 :) 来自docs:
ZipFile.extractall([path[, members[, pwd]]])
从存档中提取所有成员到当前工作目录。 path 指定要提取到的不同目录。 members 是可选的,并且必须是 namelist() 返回的列表的子集。密码 是用于加密文件的密码。
所以你应该为 ZipFile 对象调用这个函数,而不是静态方法。并且您不应将存档名称作为第一个参数传递。 :)
这样就可以了:
from zipfile import ZipFile
with ZipFile('data.zip') as zf:
zf.extractall(pwd='dg'
EDIT,在较新的版本中使用:
zf.extractall(pwd=b'dg')
【讨论】:
谢谢您,以上方法有效,我接受您的回答。但我注意到 extractall 方法需要相当长的时间才能完成。准确地说是5分钟左右。我压缩了 8 个文件,包括 bmp、png、jpeg、wav、ogg 和 mp3,总大小为 10.7Mb。这是为什么?我不得不在这么小的尺寸上等待这么久。想了解更多关于这方面的信息。 :) 对@wookie 关于 ZipFile 为何如此缓慢的老问题的回答:文档状态为Decryption is extremely slow as it is implemented in native Python rather than C.
其实是 zf.extractall(pwd=b'dg')
@LarrySong 感谢提及b
。这是正确的方法。【参考方案2】:
要提供不带首字母缩写词的确切语法:
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'))
【讨论】:
以上是关于为啥python不能解压由winrar使用zip方法创建的受密码保护的zip文件?的主要内容,如果未能解决你的问题,请参考以下文章
java压缩中文zip,系统winrar解压改中文zip会出现乱码
我下了一个7zip文件用WinRAR能打开吗?打不开怎么办???