4

我在 python 中遇到一个奇怪的错误。当我尝试使用 zip 模块提取受密码保护的文件时,尝试将“oy”设置为密码时出现异常。其他一切似乎都有效。ZipFile 模块中的错误?

import zipfile    
zip = zipfile.ZipFile("file.zip", "r")
zip.setpassword("oy".encode('utf-8'))
zip.extractall() #Above password "oy" generates the error here
zip.close()

这是我得到的例外:

Traceback (most recent call last):
  File "unzip.py", line 4, in <module>
    zip.extractall()
  File "C:\Program Files\Python32\lib\zipfile.py", line 1002, in extrac
l
    self.extract(zipinfo, path, pwd)
  File "C:\Program Files\Python32\lib\zipfile.py", line 990, in extract
    return self._extract_member(member, path, pwd)
  File "C:\Program Files\Python32\lib\zipfile.py", line 1035, in _extra
member
    shutil.copyfileobj(source, target)
  File "C:\Program Files\Python32\lib\shutil.py", line 65, in copyfileo
    buf = fsrc.read(length)
  File "C:\Program Files\Python32\lib\zipfile.py", line 581, in read
    data = self.read1(n - len(buf))
  File "C:\Program Files\Python32\lib\zipfile.py", line 633, in read1
    max(n - len_readbuffer, self.MIN_READ_SIZE)
zlib.error: Error -3 while decompressing: invalid block type

如果我使用 UTF-16 作为编码,我会收到此错误:

zlib.error: Error -3 while decompressing: invalid distance too far back

编辑 我现在已经在虚拟 Linux 机器上测试了以下内容:

  • Python版本:2.6.5
  • 我创建了一个受密码保护的 zip 文件zip -e file.zip hello.txt

现在看来问题出在了别的地方。现在,即使密码错误,我也可以提取 zip 文件!

try:
    zip.setpassword("ks")  # "ks" is wrong password but it still extracts the zip
    zip.extractall()
except RuntimeException:
    print "wrong!"

有时我可以使用错误的密码提取 zip 文件。然后提取文件(在 zip 文件中),但是当我尝试打开它时,信息似乎已损坏/解密。

4

3 回答 3

8

如果密码有问题,通常会出现以下异常:

RuntimeError: ('Bad password for file', <zipfile.ZipInfo object at 0xb76dec2c>)

由于您的异常抱怨块类型,很可能您的 .zip 存档已损坏,您是否尝试使用独立的解压缩实用程序解压缩它?

或者,也许您使用了一些有趣的东西,例如 7zip 来创建它,它会生成不兼容的 .zip 档案。


您没有提供足够的信息(操作系统版本?Python 版本?ZIP 存档创建者和内容?这些存档中是否有很多文件或单个存档中的单个文件?所有这些文件是否都给出相同的错误,或者您可以解压缩其中的一些? ),所以这里是快速问答部分,它应该可以帮助您找到并解决问题。

Q1。这是 Python 中的错误吗?

A1。不太可能。

Q2。什么可能导致这种行为?

A2。损坏的 zip 文件,不兼容的 zip 压缩器——因为你什么都不说,所以很难指出确切的原因。

Q3。如何找到原因?

A3。尝试隔离问题,找到给您错误的文件,尝试使用zip.testzip()和/或使用不同的解压缩实用程序解压缩该特定文件,分享结果。只有您可以访问有问题的文件,所以除非您自己尝试做某事,否则没有人可以帮助您

Q4。如何解决这个问题?

A4。你不能。使用不同的拉链提取器,ZipFile将不起作用。

于 2012-05-05T20:04:15.977 回答
6

在提取文件之前尝试使用该testzip()方法检查文件的完整性。

于 2012-05-09T13:37:13.333 回答
3

它可能是 zipfile 中的错误,或者是您的 zip 实现中的错误。我注意到您的行号与我的不匹配,所以我猜这是我拥有的当前 3.2.3 版本之前的 python 3.2。

现在,至于您的代码,它确实适用于 Linux 上的 Python 3.2.3。我建议您更新到最新的 3.2.x,因为似乎有许多与 zipfile 和 zlib 相关的错误修复,包括对崩溃的修复。

于 2012-05-09T19:35:21.203 回答