我正在尝试读取用 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
据我所知,这个文件不跨越多个磁盘。我这样说是因为:
检查此 Stackoverflow 答案中的解决方案,我的 zipfile 版本已适当修补。
它可以很好地解压缩:
$ unzip myfile.zip
在 linux 命令行上。
因此,它实际上似乎并不是一个糟糕的 zip 文件。通过使用原始文件访问打开它来读取前几个字节,有一个暗示性的标题,PKzip 可能正在以一种有趣的方式格式化这个文件:
b'PK\x03
检查 zipfile 的 python 库文档,有一个 PKZIP 应用说明:
ZIP 文件格式是一种常见的存档和压缩标准。该模块提供了创建、读取、写入、附加和列出 ZIP 文件的工具。此模块的任何高级使用都需要了解 PKZIP 应用说明中定义的格式。
链接在这里。这是非常彻底的,但我没有看到有关如何将哪些选项添加到对 zipfile 的调用以正确解析文件的具体说明。
PKZIP 的使用相当广泛,所以我很惊讶没有找到更常见的示例或原生支持。在 python 中打开一个引发此多磁盘错误的 pkzipped 文件需要哪些选项?