Python 将pickle读写到编码流
我们系统中常用的一种文件格式是base64编码的pickles-目前,我可以用一些简单的代码在这种普通格式的字符串之间进行转换,如下所示:Python 将pickle读写到编码流,python,Python,我们系统中常用的一种文件格式是base64编码的pickles-目前,我可以用一些简单的代码在这种普通格式的字符串之间进行转换,如下所示: def dumps( objinput ): """ Return an encoded cPickle """ return cpickle_dumps( objinput ).encode( ENCODING ) def loads( strinput ): """ Return an object fr
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 ) )
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.
我想实现一个名为“load”的新函数,它的工作原理与标准pickle load函数非常相似,只是它将从流中读取足够的字节,然后返回解码的对象。这里的诀窍是读取足够的字节-cPickle.load函数执行此操作,它从流中弹出字节,直到pickle数据完成。我的新函数需要如下所示:
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 ) )
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的多个字节,因此不清楚如何适应流\u input.read(n)当编码的输入流为base64时,保证返回n字节的解码数据。我认为实际上可以通过实现类似文件的对象来实现这一点,然后可以将该对象直接传递到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返回大小字节。允许您返回较少的值,这将简化实现。我认为您实际上可以通过实现类似文件的对象来实现这一点,然后可以将该对象直接传递给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()函数?@Salim,您通常知道4个base64输入字节产生3个输出字节。然而,这仍然意味着你可能需要稍微过火。我不认为这会满足我的不过火标准。如果您不知道有多少字节的输入将产生一个字节的输出,那么如何实现始终返回一个解码字节的read()函数?@Salim,您通常知道4个base64输入字节产生3个输出字节。然而,这仍然意味着你可能需要稍微过度阅读。