如何在python中使用pickle附加?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12761991/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 11:49:31  来源:igfitidea点击:

How to use append with pickle in python?

pythonpython-2.7

提问by Jannat Arora

i need to append to a pickle file (as i don't have the entire dictionary with me at one go). So for doing the same I have written the following code:

我需要附加到一个泡菜文件(因为我没有一次随身携带整个字典)。因此,为了做同样的事情,我编写了以下代码:

 import pickle
 p={}
 p[1]=2
 q={}
 q['a']=p
 p={}
 p[2]=0
 pickle.dump(q, open("save12.p","ab"))
 f={}
 f['b']=p
 pickle.dump(f,open("save12.p","ab"))

However, when I am loading the pickle file I don't find the value of dictionary f there?????

但是,当我加载泡菜文件时,我在那里找不到字典 f 的值????

Can someone please suggest as to how should I go about appending in a pickle file???

有人可以建议我应该如何添加泡菜文件吗???

Also databases like 'dbm' are not working for my need as i am working on windows

像“dbm”这样的数据库也不能满足我的需要,因为我在 Windows 上工作

采纳答案by nneonneo

Pickle streams are entirely self-contained, and so unpickling will unpickle one object at a time.

Pickle 流是完全独立的,因此 unpickling 将一次 unpickle 一个对象。

Therefore, to unpickle multiple streams, you should repeatedly unpickle the file until you get an EOFError:

因此,要解压多个流,您应该反复解压文件,直到出现 EOFError:

>>> f=open('a.p', 'wb')
>>> pickle.dump({1:2}, f)
>>> pickle.dump({3:4}, f)
>>> f.close()
>>> 
>>> f=open('a.p', 'rb')
>>> pickle.load(f)
{1: 2}
>>> pickle.load(f)
{3: 4}
>>> pickle.load(f)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
EOFError

so your unpickle code might look like

所以你的 unpickle 代码可能看起来像

import pickle
objs = []
while 1:
    try:
        objs.append(pickle.load(f))
    except EOFError:
        break

回答by Rangoli Thakur

#To append to a pickle file
import pickle

p={1:2}
q={3:4}
filename="picklefile"
with open(filename, 'a+') as fp:
    pickle.dump(p,fp)
    pickle.dump(q,fp)


#To load from pickle file
data = []
with open(filename, 'rb') as fr:
    try:
        while True:
            data.append(pickle.load(fr))
    except EOFError:
        pass