2011-03-22 24 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()