2017-02-10 34 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 zip文件需要予以取消封存:

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

from一些快速的谷歌搜索,我發現你可能需要的功能:'保存= pickle.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))