загрузить файл pickle из zipfile

По какой-то причине я не могу заставить cPickle.load работать с объектом типа файла, возвращаемым ZipFile.open (). Если я вызываю read () для объекта типа файла, возвращаемого ZipFile.open (), я могу использовать cPickle.loads.

Пример ….

import zipfile import cPickle # the data we want to store some_data = {1: 'one', 2: 'two', 3: 'three'} # # create a zipped pickle file # zf = zipfile.ZipFile('zipped_pickle.zip', 'w', zipfile.ZIP_DEFLATED) zf.writestr('data.pkl', cPickle.dumps(some_data)) zf.close() # # cPickle.loads works # zf = zipfile.ZipFile('zipped_pickle.zip', 'r') sd1 = cPickle.loads(zf.open('data.pkl').read()) zf.close() # # cPickle.load doesn't work # zf = zipfile.ZipFile('zipped_pickle.zip', 'r') sd2 = cPickle.load(zf.open('data.pkl')) zf.close() 

Примечание. Я не хочу застегивать только файл pickle, но много файлов других типов. Это просто пример.

One Solution collect form web for “загрузить файл pickle из zipfile”

Это связано с несовершенством в zipfile модулем zipfile (для метода ZipFile класса ZipFile введенного в Python 2.6). Рассматривать:

 >>> f = zf.open('data.pkl') >>> f.read(1) '(' >>> f.readline() 'dp1\n' >>> f.read(1) '' >>> 

последовательность .read(1).readline() – это то, что .loads внутренне делает (на .loads протокола-0, по умолчанию в Python 2, что вы используете здесь). К сожалению, zipfile означает, что эта конкретная последовательность не работает, создавая ложный «конец файла» (.read, возвращающий пустую строку) сразу после первой пары read / readline.

Не уверен, если эта ошибка в стандартной библиотеке Python исправлена ​​в Python 2.7 – я собираюсь проверить.

Изменить : просто проверено – ошибка исправлена ​​в Python 2.7 rc1 (кандидат на выпуск, который в настоящее время является последней версией 2.7). Я еще не знаю, исправлено ли это в последней версии исправления ошибок 2.6.

Изменить еще раз : ошибка все еще существует в Python 2.6.5, последней версии исправления ошибок Python 2.6 – поэтому, если вы не можете обновить до версии 2.7 и вам нужно ZipFile.open с ZipFile.open из ZipFile.open , 2.7 исправление кажется единственным жизнеспособным решением.

Обратите внимание, что не уверен, что вам нужны более корректные псевдофильные объекты; если вы контролируете вызовы дампа и можете использовать протокол самого последнего и самого лучшего, все будет хорошо:

 >>> zf = zipfile.ZipFile('zipped_pickle.zip', 'w', zipfile.ZIP_DEFLATED) >>> zf.writestr('data.pkl', cPickle.dumps(some_data, -1)) >>> sd2 = cPickle.load(zf.open('data.pkl')) >>> 

это только старый крутой обратный совместимый «протокол 0» (по умолчанию), который требует правильного поведения псевдофайлового объекта при смешивании вызовов чтения и чтения в load (протокол 0 также медленнее и приводит к более крупным огурцам, поэтому он определенно не рекомендуется, если только наоборот совместимость со старыми версиями Python или только характерный для ascii соленых огурцов, которые производят 0, являются обязательными ограничениями в вашем приложении).

  • Python распакует AES-128 зашифрованный файл
  • Установка разрешений для сжатого файла в python
  • Как удалить или заменить файл в zip-архиве?
  • Python - как конвертировать Unicode имя файла в CP437?
  • zipfile-модуль, дающий ненадежные результаты
  • python / zip: Как устранить абсолютный путь в zip-архиве, если предоставлены абсолютные пути для файлов?
  • Как создать zip-архив каталога
  • Модуль zipfile python, похоже, не сжимает мои файлы
  • Смутно о создании CSV-файла в ZIP-файл в django
  • Ошибка неправильного числа магов с помощью модуля ZipFile в Python
  • Создать .zip в Python?
  • Python - лучший язык программирования в мире.