微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么附加二进制泡菜不起作用?

如何解决为什么附加二进制泡菜不起作用?

您为什么会认为附加二进制泡菜会产生单个泡菜?借助酸洗,您可以一个一个地放置(并取回)多个项目,因此很明显,它必须是“自终止”序列化格式。忘掉台词,把它们找回来!例如:

>>> import pickle
>>> import cStringIO
>>> s = cStringIO.StringIO()
>>> pickle.dump(23, s)
>>> pickle.dump(45, s)
>>> s.seek(0)
>>> pickle.load(s)
23
>>> pickle.load(s)
45
>>> pickle.load(s)
Traceback (most recent call last):
   ...
EOFError
>>>

只需按一下EOFError即可告知您完成脱酸处理的时间。

解决方法

我知道这并不是应该使用pickle模块的方式,但是我认为这会起作用。我正在使用Python 3.1.2

这是背景代码:

import pickle

FILEPATH='/tmp/tempfile'

class HistoryFile():
    """
    Persistent store of a history file  
    Each line should be a separate Python object
    Usually,pickle is used to make a file for each object,but here,I'm trying to use the append mode of writing a file to store a sequence
    """

    def validate(self,obj):
        """
        Returns whether or not obj is the right Pythonic object
        """
        return True

    def add(self,obj):
        if self.validate(obj):
            with open(FILEPATH,mode='ba') as f:    # appending,not writing
                f.write(pickle.dumps(obj))
        else:
            raise "Did not validate"

    def unpack(self):
        """
        Go through each line in the file and put each python object
        into a list,which is returned
        """
        lst = []
        with open(FILEPATH,mode='br') as f:
            # problem must be here,does it not step through the file?
            for l in f:
                lst.append(pickle.loads(l))
        return lst

现在,当我运行它时,它仅打印出传递给该类的第一个对象。

if __name__ == '__main__':

    L = HistoryFile()
    L.add('a')
    L.add('dfsdfs')
    L.add(['dfdkfjdf','errree','cvcvcxvx'])

    print(L.unpack())       # only prints the first item,'a'!

这是因为看到的是早期EOF吗?也许追加仅适用于ASCII?(在那种情况下,为什么让我执行mode =’ba’?)有没有更简单的方法?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。