我们系统中常用的文件格式是base64编码的泡菜 - 目前我可以用这种简单的代码转换成字符串和字符串,如下所示:
def dumps( objinput ):
"""
Return an encoded cPickle
"""
return cpickle_dumps( objinput ).encode( ENCODING )
def loads( strinput ):
"""
Return an object from an encoded cpickle
"""
return cpickle_loads( strinput.decode( ENCODING ) )
我想实现一个名为“load”的新函数,它的工作方式与标准的pickle加载函数非常相似,只是它会从流中读取足够的字节,然后返回已解码的对象。这里的技巧是读取足够的字节--cPickle.load函数执行此操作,它会从流中弹出字节,直到pickle数据完成。我的新功能需要看起来像这样:
def load( stream_input ):
""""
Return just one object popped from the stream.
If the stream has ended, raise an exception
Do not over-read the stream.
当数据是base64编码的pickle时,我该怎么做?这里的困难似乎是,通过包装cPickle.load函数或通过包装输入流来完成这一点并不明显,另一个困难是可能是一个字节的pickle数据可能被编码为超过base64的一个字节,因此不清楚如何将stream_input.read(n)调整为保证在编码输入流为base64时返回n个字节的解码数据的东西。
答案 0 :(得分:1)
我认为你实际上可以通过实现类似文件的对象来实现这一点,然后可以将其直接传递给cPickle.load
class Base64PickleAdapter:
def __init__(self, base64_input):
...
def read(size=-1):
...
def readline():
... # Can be implemented in terms of read.
cPickle只需要read和readline。您不需要从Base64PickleAdapter.read返回大小字节。 read contract允许您返回更少,这应该简化实现。