ZipFile жалуется, есть ли способ обойти использование модуля zipfile?

StackOverflow https://stackoverflow.com/questions/488054

  •  20-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь распаковать некоторые MMS-сообщения, отправленные мне в архивированном виде.Проблема в том, что иногда это срабатывает, а у других нет.И когда это не работает, модуль python zipfile жалуется и говорит, что это плохой zip-файл.Но zip-файл отлично распаковывается с помощью команды unix unzip.

Это то, что у меня есть

zippedfile = open('%stemp/tempfile.zip' % settings.MEDIA_ROOT, 'w+')
zippedfile.write(string)
z = zipfile.ZipFile(zippedfile)

Я использую 'w +' и записываю в него строку, строка содержит декодированное base64 строковое представление zip-файла.

Тогда мне действительно нравится это:

filelist = z.infolist()  
images = []  

for f in filelist:  
    raw_mimetype = mimetypes.guess_type(f.filename)[0]  
    if raw_mimetype:  
        mimetype = raw_mimetype.split('/')[0]  
    else:  
        mimetype = 'unknown'  
    if mimetype == 'image':  
        images.append(f.filename)  

Таким образом, у меня есть список всех изображений в zip-файле.Но это не всегда работает, поскольку модуль zipfile жалуется на некоторые файлы.

Есть ли способ сделать это, не используя модуль zipfile?

Могу ли я каким-то образом использовать unix-команду unzip вместо zipfile, а затем сделать то же самое, чтобы повторно просмотреть все изображения из архива?

Это было полезно?

Решение

Весьма вероятно, вам следует открыть файл в двоичном режиме при записи в него сжатых данных.То есть вы должны использовать

zippedfile = open('%stemp/tempfile.zip' % settings.MEDIA_ROOT, 'wb+')

Другие советы

Возможно, вам придется закрыть и снова открыть файл или, возможно, обратиться к началу файла после его записи.

filename = '%stemp/tempfile.zip' % settings.MEDIA_ROOT
zippedfile = open(filename , 'wb+')
zippedfile.write(string)
zippedfile.close()
z = zipfile.ZipFile(filename,"r")

Вы говорите, что строка декодирована в base64, но вы не показали никакого кода, который ее декодирует - вы уверены, что она все еще не закодирована?

data = string.decode('base64')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top