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

Я использую 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:\Python27\lib\zipfile.py", line 950, in extract
    return self._extract_member(member, path, pwd)
  File "C:\Python27\lib\zipfile.py", line 993, in _extract_member
    source = self.open(member, pwd=pwd)
  File "C:\Python27\lib\zipfile.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

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

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

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


person haltTm    schedule 09.10.2011    source источник


Ответы (2)


Правильные файлы 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')
person ghostmansd    schedule 09.10.2011
comment
@ petr-viktorin Да, это zip. Приведенный выше код дал PK♥♦ в качестве вывода. - person haltTm; 09.10.2011
comment
Хм. Не могли бы вы поместить свой файл на любой сервер, чтобы я мог его посмотреть и попытаться открыть? - person ghostmansd; 09.10.2011
comment
Посмотрите исходный ответ, я опубликовал другую идею. - person ghostmansd; 09.10.2011
comment
Хм, я не могу извлечь pdf из вашего файла с помощью Ark. Вернее, он извлекает пустой файл размером 0 KiB. - person ghostmansd; 10.10.2011
comment
7-Zip сообщает о неподдерживаемом методе сжатия - person John Machin; 10.10.2011
comment
В настоящее время zip-файл Python поддерживает только метод DEFLATE. Кажется, вы создали свой файл с помощью WinRar другим методом, поэтому zipfile может только читать файл, но не извлекать его. - person ghostmansd; 10.10.2011

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

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

person Petr Viktorin    schedule 09.10.2011