【问题标题】:How to read a zip file written with pkzip in python?如何在python中读取用pkzip编写的zip文件?
【发布时间】:2019-12-12 01:06:52
【问题描述】:

我正在尝试在 python 中读取一个用 pkzip 编写的 zip 文件:

import zipfile
fname = "myfile.zip"
unzipped = zipfile.ZipFile(fname, "r")

但是得到这个错误:

    unzipped = zipfile.ZipFile(fname, "r")
  File "/home/username/anaconda3/envs/c1/lib/python3.7/zipfile.py", line 1222, in __init__
    self._RealGetContents()
  File "/home/username/anaconda3/envs/c1/lib/python3.7/zipfile.py", line 1285, in _RealGetContents
    endrec = _EndRecData(fp)
  File "/home/username/anaconda3/envs/c1/lib/python3.7/zipfile.py", line 282, in _EndRecData
    return _EndRecData64(fpin, -sizeEndCentDir, endrec)
  File "/home/username/anaconda3/envs/c1/lib/python3.7/zipfile.py", line 228, in _EndRecData64
    raise BadZipFile("zipfiles that span multiple disks are not supported")
zipfile.BadZipFile: zipfiles that span multiple disks are not supported

据我所知,这个文件不跨越多个磁盘。我这样说是因为:

  1. 检查 against the solution in this Stackoverflow answer,我的 zipfile 版本已适当修补。

  2. 它可以很好地解压缩:

    $ unzip myfile.zip
    

    在 linux 命令行上。

所以,它实际上并不是一个糟糕的 zip 文件。通过使用原始文件访问打开它来读取前几个字节,有一个暗示头,PKzip 可能正在以一种有趣的方式格式化这个文件:

  b'PK\x03

查看 zipfile 的 python 库文档,有一个 PKZIP 应用说明:

ZIP 文件格式是一种常见的存档和压缩标准。这个 模块提供创建、读取、写入、附加和列出 ZIP 的工具 文件。该模块的任何高级使用都需要了解 PKZIP 应用说明中定义的格式。

links here。这是非常彻底的,但我没有看到关于如何将哪些选项添加到对 zipfile 的调用以正确解析文件的具体说明。

PKZIP 的使用相当广泛,所以我很惊讶没有找到更常见的示例或原生支持。需要哪些选项才能在 python 中打开一个引发此多磁盘错误的 pkzipped 文件?

【问题讨论】:

    标签: python zip unzip pkzip


    【解决方案1】:

    您发布的链接从这里更改为zipfile

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

    到这里

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

    如果您仍然收到错误“不支持跨多个磁盘的压缩文件”,则表示diskno != 0disks > 1

    你需要了解更多关于myfile.zip的内部结构。

    尝试运行zipdetails 并检查最后一节的输出。以下是单个磁盘存档的外观

    # zipdetails  fred.zip 
    ...
    3CF31 END CENTRAL HEADER    06054B50
    3CF35 Number of this disk   0000
    3CF37 Central Dir Disk no   0000
    3CF39 Entries in this disk  0009
    3CF3B Total Entries         0009
    3CF3D Size of Central Dir   00000317
    3CF41 Offset to Central Dir 0003CC1A
    3CF45 Comment Length        0000
    Done
    

    【讨论】:

    • 有趣。所以我查看了 zipfile 的代码,发现它与引用的答案一致:github.com/python/cpython/blob/3.7/Lib/zipfile.py#L227 但是我在磁盘上安装的 python 3.7.3 在 zipfile.py 中的违规行仍然是错误的,因为“!=”不是“ >”。这可能是另一个问题,但标准库怎么可能呢?
    • @Mittenchops - 如果您修改 python 3.7.3 的安装,您的问题会消失吗?
    • 是的,看起来确实如此。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多