使用协议选项的cPickle文件
我有个简单的问题。有没有办法用另一种协议选项重新处理一个已经用cPickle处理过的文件?还有,针对一个非常大的文件,哪种协议会比较好?希望能得到一些帮助或建议。
2 个回答
2
你可以把它解压(unpickle)后再重新压缩(repickle)。在使用压缩的过程中,可以选择协议版本,这个可以在压缩的接口(API)中设置:
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()