为什么附加二进制泡菜不起作用? [英] Why doesn't appending binary pickles work?
问题描述
我知道这并不是应该使用pickle模块的方式,但是我认为这会起作用.我正在使用Python 3.1.2
I know this isn't exactly how the pickle module was intended to be used, but I would have thought this would work. I'm using 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
现在,当我运行它时,它只会打印出传递给该类的第一个对象.
Now, when I run it, it only prints out the first object that is passed to the class.
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'?)有没有更简单的方法?
Is this because it's seeing an early EOF? Maybe appending is intended only for ascii? (in which case, why is it letting me do mode='ba'?) Is there a much simpler duh way to do this?
推荐答案
为什么您认为附加二进制泡菜会产生单个泡菜?借助酸洗,您可以一个接一个地放置(并取回)多个项目,因此很明显,它必须是自终止"序列化格式.忘掉台词,把它们找回来!例如:
Why would you think appending binary pickles would produce a single pickle?! Pickling lets you put (and get back) several items one after the other, so obviously it must be a "self-terminating" serialization format. Forget lines and just get them back! For example:
>>> 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
即可告诉您完成脱酸的时间.
just catch the EOFError
to tell you when you're done unpickling.
这篇关于为什么附加二进制泡菜不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!