Python Pickle 帮助

1 投票
2 回答
3525 浏览
提问于 2025-04-16 02:19

我不太明白为什么这个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

撰写回答