Python Pickle帮助

Python Pickle帮助,python,pickle,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 o

我不确定为什么这个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
理想情况下,我希望使用for循环建立一个字典,然后将key:value对添加到pickle.dat文件中,然后清除字典以保存一些RAM


这是怎么回事?

我开始编辑您的代码以提高可读性,并在过程中考虑了append\u对象

这里有很多困惑。首先,pickle.dump编写一个完整的Python对象。可以在pickle文件中放置多个对象,但每个对象都需要自己的加载。代码按照您的要求执行,并将您编写的第一本词典加载到该文件中。第二本词典在那里等待阅读,但它不是第一本词典的串联,而是它自己的可加载词典

不要低估名字的重要性。append_对象不是一个好名字,但它不同于append_to_对象


如果要打开一个文件进行读取,只需打开它进行读取,也可以打开它进行写入或追加。它不仅使您的意图更加清晰,而且还防止了愚蠢的错误。

我开始编辑您的代码以提高可读性,并在过程中考虑了append\u对象

这里有很多困惑。首先,pickle.dump编写一个完整的Python对象。可以在pickle文件中放置多个对象,但每个对象都需要自己的加载。代码按照您的要求执行,并将您编写的第一本词典加载到该文件中。第二本词典在那里等待阅读,但它不是第一本词典的串联,而是它自己的可加载词典

不要低估名字的重要性。append_对象不是一个好名字,但它不同于append_to_对象


如果要打开一个文件进行读取,只需打开它进行读取,也可以打开它进行写入或追加。它不仅能让你的意图更加清晰,还能防止愚蠢的错误。

不要用pickle。使用数据库

Python似乎完全符合您的需要。它为您提供了一个类似字典的界面,但数据会保存到磁盘上

用法示例:

>>> 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

不要用泡菜做那件事。使用数据库

Python似乎完全符合您的需要。它为您提供了一个类似字典的界面,但数据会保存到磁盘上

用法示例:

>>> 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

不要将代码的空格加倍。将代码缩进四个空格,不要将代码的空格加倍。将其缩进四个空格。感谢您将我的代码放入块中。。。我一直在想办法。你是怎么做到的?根据引用,看起来我只是在代码块中我想要的内容的开始和结束处键入了一个单引号字符。但那对我不起作用=@布莱恩,你这样做是为了让代码保持一致。对于大型代码块,您可以在每行代码的开头添加四个空格,也可以只编写不带空格的代码,突出显示它,然后单击代码示例按钮,该按钮看起来像1和0。我仍然不确定如何修改上述代码以在pickle文件中保存这两个定义…感谢您将我的代码放入块中。。。我一直在想办法。你是怎么做到的?根据引用,看起来我只是在代码块中我想要的内容的开始和结束处键入了一个单引号字符。但那对我不起作用=@布莱恩,你这样做是为了让代码保持一致。对于大型代码块,您可以在每行代码的开头添加四个空格,或者您可以简单地编写不带空格的代码,突出显示它,然后单击代码示例按钮,看起来像1和0。我仍然不太确定如何修改上述代码以在pickle文件中保留这两个定义…哦,我的天哪!!!那个dbm模块看起来棒极了!非常感谢你!!!!我一定要试一试!另请注意:根据Python网站:在Python 3.0中,dbm模块已重命名为dbm.ndbm。2to3工具将在将源代码转换为3.0时自动调整导入。此外,我刚刚注意到这是一个Unix模块。我在Windows7下编码…嗯,对不起,你仍然应该使用Pyhton3下的dbm模块,而不是dbm.ndbm。在窗户下工作很好。哦,天哪!!!那个dbm模块看起来棒极了!非常感谢你!!!!我一定要试一试!另请注意:根据Python网站:在Python 3.0中,dbm模块已重命名为dbm.ndbm。2to3工具将在将源代码转换为3.0时自动调整导入。此外,我刚刚注意到这是一个Unix模块。我在Windows7下编码…嗯,对不起,你仍然应该使用Pyhton3下的dbm模块,而不是dbm.ndbm。它在窗户下工作很好。