Ошибка неправильного магического числа с модулем ZipFile в Python

#python #unzip #python-2.7 #zipfile

#python #python-2.7 #распаковать #python-zipfile

Вопрос:

Я использую Python 2.7 в Windows 7 (64-разрядная версия). Когда я пытаюсь распаковать zip-файл с помощью модуля ZipFile, я получаю следующую ошибку:-

 Traceback (most recent call last):
  File "unzip.py", line 8, in <module>
    z.extract(name)
  File "C:Python27libzipfile.py", line 950, in extract
    return self._extract_member(member, path, pwd)
  File "C:Python27libzipfile.py", line 993, in _extract_member
    source = self.open(member, pwd=pwd)
  File "C:Python27libzipfile.py", line 897, in open
    raise BadZipfile, "Bad magic number for file header"
zipfile.BadZipfile: Bad magic number for file header
  

WinRAR может извлечь файл, который я пытаюсь извлечь, просто отлично.
Вот код, который я использовал для извлечения файлов из myzip.zip

 from zipfile import ZipFile
z = ZipFile('myzip.zip')   //myzip.zip contains just one file, a password protected pdf        
for name in z.namelist():
    z.extract(name)
  

Этот код отлично работает для многих других zip-файлов, которые я создал с помощью WinRAR, но myzip.zip

Я попытался прокомментировать следующие строки в Python27Libzipfile.py :-

 if fheader[0:4] != stringFileHeader:
   raise BadZipfile, "Bad magic number for file header"
  

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

Ответ №1:

Правильные ZIP-файлы всегда имеют » x50 x4B x03 x04″ в начале. Вы можете проверить, действительно ли файл является ZIP-файлом с помощью этого кода:

 with open('/path/to/file', 'rb') as MyZip:
  print(MyZip.read(4))
  

Он напечатает заголовок файла, чтобы вы могли проверить.

ОБНОВЛЕНИЕ Странно, testzip() и все остальные функции работают хорошо. Вы пробовали такой код?

 with zipfile.GzipFile('/path/to/file') as Zip:
  for ZipMember in Zip.infolist():
    Zip.extract(ZipMember, path='/dir/where/to/extract', pwd='your-password')
  

Комментарии:

1. @petr-viktorin Да, это молния. Приведенный выше код был выдан PK♥♦ в качестве выходных данных.

2. Хм. Не могли бы вы поместить свой файл на любой сервер, чтобы я мог посмотреть на него и попытаться открыть?

3. Посмотрите на оригинальный ответ, я опубликовал другую идею.

4. Хм, я не могу извлечь pdf из вашего файла с помощью Ark. Чтобы быть более правильным, он извлекает пустой файл размером 0 КБ.

5. Zipfile в Python в настоящее время поддерживает только метод DEFLATE. Похоже, вы создали свой файл с помощью WinRAR, используя другой метод, поэтому zipfile может только читать файл, но не извлекать.

Ответ №2:

Убедитесь, что вы действительно открываете ZIP-файл, а не, например, файл RAR с расширением .zip. У соответствующих zip-файлов есть заголовок, который в данном случае не был найден.

zipfile Модуль может открывать только zip-файлы. WinRAR также может открывать другие форматы, и, скорее всего, игнорирует имя файла и просматривает только сам файл.