Использование zipfile.is_zipfile на zips, встроенных в zips - PullRequest
0 голосов
/ 03 мая 2019

is_zipfile в файле правильно определяет zip-файлы. Но при работе с файловым объектом, сгенерированным zipfile.open, это не так. Есть ли способ заставить это работать, или я должен извлечь файл во временную папку перед использованием?

import zipfile

file = open(r'c:\temp\test.xlsx', 'rb')
if zipfile.is_zipfile(file): # only works with native files, not file-like
    print('Zip') # this line is executed, as expected
else:
    print('Not zip')

zip = zipfile.ZipFile(open(r'c:\temp\test.zip', 'rb'))
file = zip.open('test.xlsx', 'r')
if zipfile.is_zipfile(file): # only works with native files, not file-like
    print('Zip')
else:
    print('Not zip') # this line is executed. WHY?

Мой вывод:

Zip
Not zip

Мой ожидаемый результат заключается в том, что оба должны тестироваться как zip-файл. Он работает для собственного файла, но не как часть zip-файла.

1 Ответ

1 голос
/ 07 мая 2019

Не ответ / исправление, а обходной путь - загрузка данных в память.

zip = zipfile.ZipFile(open(r'c:\temp\test.zip', 'rb'))
file = zip.open('test.xlsx', 'r')
data = file.read()
if zipfile.is_zipfile(StringIO.StringIO(data)):
    print('Zip')
else:
    print('Not zip')

Похоже, что файл-подобный файл, созданный zipfile.open, не достаточно похож на файл для zipfile.is_zipfile для использования.

...