Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将pickle读写到编码流_Python - Fatal编程技术网

Python 将pickle读写到编码流

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

我们系统中常用的一种文件格式是base64编码的pickles-目前,我可以用一些简单的代码在这种普通格式的字符串之间进行转换,如下所示:

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个输出字节。然而,这仍然意味着你可能需要稍微过度阅读。