我有一个愚蠢的问题。可以使用其他协议选项重新选择(cPickle)已经使用cPickled的文件,以及哪种协议最适合非常大的文件。非常感谢任何帮助/建议。
答案 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的一部分: