cPickle文件使用协议选项

时间:2011-03-22 03:53:51

标签: python

我有一个愚蠢的问题。可以使用其他协议选项重新选择(cPickle)已经使用cPickled的文件,以及哪种协议最适合非常大的文件。非常感谢任何帮助/建议。

2 个答案:

答案 0 :(得分:4)

我真的不明白你腌制文件是什么意思。你想读取一个腌制的文件作为二进制文件而不进行unpickling,然后再次腌制它?这不应该是一个问题,但我看不出会有什么好处......

pickle中的默认协议版本为0,ASCII(pickle docs)。最新的二进制协议是2,它为您提供较小的文件大小。对我来说,二进制泡菜输出只是som jpg图片的一半,与ASCII pickle一样,代码如下。

您可能需要考虑cerealizer哪个类似接口但是更安全。它似乎有自己的二进制协议,文件大小与pickle binary一样小。

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()

答案 1 :(得分:2)

你取消它并腌制它。可以选择协议版本作为pickle API的一部分:

http://docs.python.org/library/pickle.html