如何在python中读取用pkzip编写的zip文件?

时间:2019-12-12 01:06:52

标签: python zip unzip pkzip

我正在尝试读取用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. 检查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中打开引发此多磁盘错误的pkzip压缩文件需要哪些选项?

1 个答案:

答案 0 :(得分:0)

您发布的链接对此已更改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")

如果仍然出现错误“不支持跨多个磁盘的 zipfile ”,则表示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