Как прочитать zip-файл, написанный с помощью pkzip, на python?
Я пытаюсь прочитать zip-файл на Python, написанный с помощью pkzip:
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
Насколько я могу судить, этот файл не занимает несколько дисков. Я говорю это потому, что:
Проверяя решение в этом ответе Stackru, моя версия zip-файла была исправлена соответствующим образом.
Распаковывается отлично с:
$ unzip myfile.zip
в командной строке linux.
Так что на самом деле это не плохой zip-файл. Читая первые несколько байтов, открывая его с доступом к необработанному файлу, можно увидеть заголовок, указывающий на то, что PKzip может форматировать этот файл интересным образом:
b'PK\x03
Изучив документацию библиотеки python для zipfile, есть примечание к приложению PKZIP:
Формат файла ZIP является распространенным стандартом архивирования и сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и перечисления ZIP-файла. Любое расширенное использование этого модуля потребует понимания формата, как определено в примечаниях к применению PKZIP.
Которые ссылки здесь. Это очень тщательно, но я не вижу конкретных инструкций о том, как добавить параметры в вызов zip-файла, чтобы правильно проанализировать файл.
PKZIP довольно широко используется, поэтому я удивлен, что не нашел более распространенных примеров или встроенной поддержки. Какие параметры необходимы, чтобы открыть файл pkzip в python, который вызывает эту многодисковую ошибку?
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")
Если вы по-прежнему получаете сообщение об ошибке "zip-файлы, расположенные на нескольких дисках, не поддерживаются", это означает, чтоdiskno != 0
или disks > 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