Как прочитать 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

Насколько я могу судить, этот файл не занимает несколько дисков. Я говорю это потому, что:

  1. Проверяя решение в этом ответе Stackru, моя версия zip-файла была исправлена ​​соответствующим образом.

  2. Распаковывается отлично с:

    $ 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
Другие вопросы по тегам