为啥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能打开吗?打不开怎么办???

使用commons-compress压缩的zip,用winrar解压出错?

ZIP格式的文件下载后怎么解压?

winrar自解压后自动运行bat批处理没有处理效果

如何解压zip文件?