Python Pickle 帮助
我不太明白为什么这个Pickle的例子没有显示出两个字典的定义。根据我的理解,“ab+”应该意味着可以在pickle.dat文件中追加内容,并且可以读取这个文件。我对Pickle这个概念还很陌生,但网上的教程似乎只讲了最初的存储部分。
import cPickle as pickle
def append_object(d, fname):
"""appends a pickle dump of d to fname"""
print "append_hash", d, fname
with open(fname, 'ab') as pickler:
pickle.dump(d, pickler)
db_file = 'pickle.dat'
cartoon = {}
cartoon['Mouse'] = 'Mickey'
append_object(cartoon, db_file)
cartoon = {}
cartoon['Bird'] = 'Tweety'
append_object(cartoon, db_file)
print 'loading from pickler'
with open(db_file, 'rb') as pickler:
cartoon = pickle.load(pickler)
print 'loaded', cartoon
理想情况下,我希望通过一个循环来构建一个字典,然后把这个字典的键值对添加到pickle.dat文件中,之后再清空字典,以节省一些内存。
这到底是怎么回事呢?
2 个回答
3
我开始修改你的代码,让它更容易阅读,同时也把 append_object
这个部分提取了出来。
这里有几个地方容易让人困惑。首先,pickle.dump
是把一个 Python 对象完整地写入文件。你可以在一个 pickle 文件里放多个对象,但每个对象都需要单独用 load
来读取。你的代码做了你要求的事情,读取了你写入文件的第一个字典。第二个字典虽然在那儿等着被读取,但它并不是第一个字典的延续,而是一个独立的对象。
别小看名字的重要性。append_object
这个名字不太好,但它和 append_to_object
是不一样的。
如果你是要打开一个文件来读取,那就只用读取的方式打开;写入或追加的时候也是一样。这样不仅能让你的意图更清晰,还能避免一些低级错误。
5
别用pickle来做这个,还是用数据库吧。
Python的dbm
模块看起来非常适合你的需求。它给你一个像字典一样的界面,但数据是保存在硬盘上的。
使用示例:
>>> import dbm
>>> x = dbm.open('/tmp/foo.dat', 'c')
>>> x['Mouse'] = 'Mickey'
>>> x['Bird'] = 'Tweety'
明天你可以加载这些数据:
>>> import dbm
>>> x = dbm.open('/tmp/foo.dat', 'c')
>>> print x['Mouse']
Mickey
>>> print x['Bird']
Tweety