代码之家  ›  专栏  ›  技术社区  ›  Salim Fadhley

读写pickles到编码流

  •  1
  • Salim Fadhley  · 技术社区  · 15 年前

    我们系统中常用的一种文件格式是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 ) )
    

    我想实现一个名为“load”的新函数,它的工作原理与标准pickle load函数非常相似,只是它将从流中读取足够的字节,然后返回解码后的对象。这里的技巧是读取足够的字节—cpickle.load函数执行此操作,它从流中弹出字节,直到pickled数据完成。我的新功能需要如下所示:

    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的多个字节,因此不清楚如何调整流的输入。将(n)读取到guaranteed在编码的输入流为base64时返回n字节的解码数据。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Matthew Flaschen    15 年前

    我认为您实际上可以通过实现一个类似文件的对象来实现这一点,然后可以将该对象直接传递给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。您不需要从base64pickledadapter.read返回大小字节。这个 read contract 允许您返回较少的值,这将简化实现。