读取和编写游戏到编码流

时间:2010-06-03 12:49:06

标签: python

我们系统中常用的文件格式是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个字节的解码数据的东西。

1 个答案:

答案 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允许您返回更少,这应该简化实现。