pickle - 在文件中放入多个对象?

时间:2013-03-17 16:47:55

标签: python file pickle

我有一个方法可以将一些pickle对象(实际上是元组)转储到一个文件中。

我不想把它们放在一个列表中,我真的想多次转储到同一个文件中。 我的问题是,如何再次加载对象? 第一个和第二个对象只有一行,所以这适用于readlines。 但所有其他人都更长。 自然,如果我尝试

myob = cpickle.load(g1.readlines()[2])

其中g1是文件,我得到一个EOF错误,因为我的pickle对象长于一行。 有没有办法得到我的腌制物?

3 个答案:

答案 0 :(得分:66)

如果您直接将文件句柄传递给pickle,您可以获得所需的结果。

import pickle

# write a file
f = open("example", "w")
pickle.dump(["hello", "world"], f)
pickle.dump([2, 3], f)
f.close()

f = open("example", "r")
value1 = pickle.load(f)
value2 = pickle.load(f)
f.close()

pickle.dump将附加到文件的末尾,因此您可以多次调用它来写入多个值。

pickle.load将从文件中读取足够的内容以获取第一个值,使文件句柄保持打开状态并指向文件中下一个对象的开头。然后第二个调用将读取第二个对象,并将文件指针保留在文件的末尾。第三次调用将失败,并且EOFError正如您所期望的那样。

虽然我在我的示例中使用了普通的pickle,但此技术与cPickle的工作原理相同。

答案 1 :(得分:18)

我认为最好的方法是在存储之前将数据打包到单个对象中,并在加载后将其解压缩。这是一个使用的例子 作为容器的元组(you can use dict also):

a = [1,2]
b = [3,4]

with open("tmp.pickle", "wb") as f:
    pickle.dump((a,b), f)

with open("tmp.pickle", "rb") as f:
    a,b = pickle.load(f) 

答案 2 :(得分:1)

不要尝试将它们作为文件的行读回,只需要pickle.load()您想要的对象数量。有关这样做的示例,请参阅我对问题How to save an object in Python的回答。