2011-03-22 29 views
-1

我有一個愚蠢的問題。可能使用另一個協議選項重新使用已經cPickled的文件(cPickle),以及哪種協議最適合非常大的文件。將不勝感激任何幫助/建議。cPickle文件使用協議選項

回答

4

我真的不明白你的酸洗文件的意思。你想閱讀一個醃製文件作爲二進制文件,而不unpickling,然後再次醃製它?這應該不是問題,但我不認爲它會做什麼好...

pickle中的默認協議版本是0,ASCII(pickle docs)。最新的二進制協議是2,它給你更小的文件大小。對於我來說,一個二進制pickle輸出只是som jpg圖片的一半大小,與下面代碼中的ASCII pickle一樣大。

你可能想要考慮cerealizer它有一個類似界面的泡菜,但更安全。它似乎有它自己的二進制協議,文件大小與pickle二進制一樣小。

import cerealizer 
#import cPickle as cerealizer 

def save(data, filename): 
    f = open(filename,"wb") 
    cerealizer.dump(data, f, protocol=2) 
    f.close() 

def load(filename): 
    f = open(filename,"rb") 
    p = cerealizer.load(f) 
    f.close() 
    return(p) 

if __name__ == "__main__": 
    import PIL.Image 
    import cStringIO as StringIO 

    stringIO = StringIO.StringIO() 
    im = PIL.Image.open("picture.jpg") 
    im.save(stringIO, "JPEG") 

    stringIO.seek(0) 
    save(stringIO.read(), "testCerealizerIm.txt") 

    binaryImageData = load("testCerealizerIm.txt") 

    stringIO2 = StringIO.StringIO() 
    stringIO2.write(binaryImageData) 

    stringIO2.seek(0) 
    im = PIL.Image.open(stringIO2) 
    im.show()