27

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

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

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

其中 g1 是文件,我收到 EOF 错误,因为我的腌制对象超过一行。有没有办法只得到我腌制的物体?

4

3 回答 3

80

如果您将文件句柄直接传递给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如您所料,第三次调用将失败。

尽管我在示例中使用了普通的 old pickle,但这种技术与cPickle.

于 2013-03-17T16:55:44.737 回答
23

我认为最好的方法是在存储之前将数据打包到单个对象中,并在加载后解包。这是一个使用元组作为容器(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) 
于 2014-04-14T09:14:33.257 回答
2

不要尝试将它们作为文件的行读回,只是pickle.load()你想要的对象数。有关执行此操作的示例,请参阅我对如何在 Python 中保存对象的问题的回答。

于 2013-03-17T16:54:20.833 回答