2017-02-10 5 views
0

Использование zipfile архивировать data словарь:Как заархивировать двоичные данные

import os, sys, cPickle, zipfile 
data = {1: 'one'} 
pfile = r'c:\temp\myPickle.p' 
cPickle.dump(data, open(pfile, "wb")) 

zfilename = r'c:\temp\myArchive.zip' 
zfile = zipfile.ZipFile(zfilename, "w", zipfile.ZIP_DEFLATED) 
zfile.write(pfile, os.path.basename(pfile)) 
zfile.close() 

подход приводит два файла на локальном диске: один является рассол, а другой является застежка-молния. Чтобы маринованные data зип файл должен быть не-архив:

fh = open(zfilename, 'rb') 
z = zipfile.ZipFile(fh) 
for each in z.namelist(): 
    z.extract(each, r'c:\temp') 
fh.close() 

Как упростить этот процесс?

+0

[ZipFile.open] (https://docs.python.org/3/library/zipfile.html#zipfile.ZipFile.open), [ZipFile.read] (HTTPS: //docs.python .org/3/library/zipfile.html # zipfile.ZipFile.read), [ZipFile.writestr] (https://docs.python.org/3/library/zipfile.html#zipfile.ZipFile.writestr) – spectras

+1

от некоторый быстрый googling, я нашел функции, которые вам, вероятно, нужны: 'saved = pickle.dumps (data)' dumps генерирует строку. zipfile имеет .writestr() для поворота строк в zip. таким образом только один файл. – Nullman

ответ

1

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

import cPickle as pickle 
import gzip 

data = {1: 'one'} 

pfile = r'test.pkl.gz' 
pickle.dump(data, gzip.open(pfile, "w"), pickle.HIGHEST_PROTOCOL) 
print pickle.load(gzip.open(pfile)) 
Смежные вопросы