0

我正在尝试读取用 pkzip 编写的 python 中的 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. 检查此 Stackoverflow 答案中的解决方案,我的 zipfile 版本已适当修补。

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

    $ unzip myfile.zip
    

    在 linux 命令行上。

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

  b'PK\x03

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

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

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

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

4

1 回答 1

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")

如果您仍然收到错误“不支持跨多个磁盘的 zipfiles ”,则表示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
于 2019-12-12T09:08:12.850 回答