使用协议选项的cPickle文件

-1 投票
2 回答
2893 浏览
提问于 2025-04-16 14:10

我有个简单的问题。有没有办法用另一种协议选项重新处理一个已经用cPickle处理过的文件?还有,针对一个非常大的文件,哪种协议会比较好?希望能得到一些帮助或建议。

2 个回答

2

你可以把它解压(unpickle)后再重新压缩(repickle)。在使用压缩的过程中,可以选择协议版本,这个可以在压缩的接口(API)中设置:

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

4

我不太明白你说的“给文件进行序列化”是什么意思。你是想直接以二进制的方式读取一个序列化的文件,而不进行反序列化,然后再进行序列化吗?这样做应该没问题,但我不太明白这样做有什么好处……

在序列化中,默认的协议版本是0,也就是ASCII格式(序列化文档)。最新的二进制协议是2,它可以让文件更小。对我来说,使用二进制序列化输出的某张jpg图片,文件大小只有ASCII序列化的一半,下面是代码。

你可能还想考虑一下cerealizer,它有类似序列化的接口,但更安全。它似乎有自己的二进制协议,文件大小和序列化的二进制文件差不多。

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

撰写回答