ZipFile жалуется, есть ли способ использовать модуль zipfile? - PullRequest
1 голос
/ 28 января 2009

Я пытаюсь распаковать некоторые MMS-сообщения, отправленные мне в архиве. Проблема в том, что иногда это работает, а другие нет. И когда он не работает, модуль python zipfile жалуется и говорит, что это плохой zip-файл. Но zipfile прекрасно распаковывается с помощью команды 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, а затем сделать то же самое, чтобы извлечь все изображения из архива?

Ответы [ 2 ]

4 голосов
/ 28 января 2009

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

zippedfile = open('%stemp/tempfile.zip' % settings.MEDIA_ROOT, 'wb+')
0 голосов
/ 28 января 2009

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

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')
...