Python zipfile 模块错误地认为我有一个跨越多个磁盘的 zipfile,抛出 BadZipfile 错误

Posted

技术标签:

【中文标题】Python zipfile 模块错误地认为我有一个跨越多个磁盘的 zipfile,抛出 BadZipfile 错误【英文标题】:Python zipfile module erroneously thinks I have a zipfile that spans multiple disks, throws BadZipfile error 【发布时间】:2013-07-15 21:27:45 【问题描述】:

我有一个 1.4GB 的 zip 文件,并且正在尝试连续让每个成员。 zipfile 模块不断抛出 BadZipfile 异常,说明

“zipfile.BadZipfile:不支持跨多个磁盘的 zipfile”。

这是我的代码:

import zipfile

def iterate_members(zip_file_like_object):
  zflo = zip_file_like_object
  assert zipfile.is_zipfile(zflo) # Here is where the error happens.
  # If I comment out the assert, the same error gets thrown on this next line:
  with zipfile.ZipFile(zflo) as zip:
    members = zip.namelist()
    for member in members:
      yield member

fn = "filename.zip"
iterate_members(open(fn, 'rb'))

我使用的是 Python 2.7.3。我在 Windows 8 和 ubuntu 上都试过,结果相同。非常感谢任何帮助。

【问题讨论】:

你能发布 zip 文件(或它的链接)吗? code that leads up to this error 非常简单;它检查文件头是否声明了多个磁盘或文件的磁盘号是否为零。 感谢 phihag。不幸的是,我无法发布该文件,因为它包含机密的客户数据。 好吧,你能生成一个包含大量测试数据但仍然显示问题的 zip 文件吗? 可能更多地取决于用于创建 .zip 的软件。我刚刚遇到了来自客户的 500MB .zip 的问题。打开包装并重新包装(显然使用与我的客户不同的 zip 工具)并且它可以工作。由于压缩较少,重新打包的文件更大。所以,大小似乎并不重要。 python3.7 可以使用文件运行,而 python3.6 不能用于我。 【参考方案1】:

虽然我使用的是 python 3.4,但我在类似文件上遇到了同样的错误

能够通过编辑 zipfile.py 源代码中的第 205 行来修复它:

if diskno != 0 or disks != 1:
    raise BadZipFile("zipfiles that span multiple disks are not supported")

到:

if diskno != 0 or disks > 1:

希望对你有帮助

【讨论】:

Windows 内置的 zip 工具似乎有问题,并且会生成一个看起来像 zip64 的存档结束记录,但实际上不是。因此_EndRecData64 找到disks == 0。它应该返回endrec。但修复效果很好,谢谢。 这有什么更新吗?这似乎不是一个可接受的解决方案,因为您需要手动修改 Python 库源代码。如果 Python 安装在云中运行而您无权访问 Python 安装怎么办。【参考方案2】:

快速修复,安装 zipfile38 使用:

pip install zipfile38

并在代码中像以前一样使用它

import zipfile38 as zipfile
#your code goes here

【讨论】:

以上是关于Python zipfile 模块错误地认为我有一个跨越多个磁盘的 zipfile,抛出 BadZipfile 错误的主要内容,如果未能解决你的问题,请参考以下文章

Python中的ZipFile模块出现错误的幻数错误

在 python 2.7 中导入 zipfile 模块时出现语法错误

Python zipfile:RuntimeError:文件密码错误

Python的zipfile模块无法更新条目[重复]

如何在 Python 中使用 zipfile 模块列出文件夹的文件

python模块之ZipFile