2013-03-17 28 views
16

我有一个方法将大量腌制对象(实际上是元组)转储到文件中。泡菜 - 把一个以上的对象放在一个文件中?

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

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

,其中G1是文件,我得到一个EOF错误,因为我的腌制对象是大于一行。 有没有办法让我的酸菜对象?

+0

为什么把他们都在一个列表中的一个问题? – 2013-03-17 17:24:13

回答

51

如果直接通过文件句柄到泡菜,你可以得到你想要的结果。

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的工作原理相同。

+0

另请参阅此答案阅读多个泡菜的答案。 [数据保存和蟒蛇泡菜文件中加载多个对象(http://stackoverflow.com/questions/20716812/saving-and-loading-multiple-objects-in-python-pickle-file) – salomonvh 2015-09-28 12:17:32

+0

这是否也与cPickle的工作吗? (显然不是......) – DreamFlasher 2017-02-27 09:15:34

13

我认为最好的办法是将数据打包成一个对象,然后存放好,并加载它后解压。下面是使用 一个例子的元组作为容器(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) 
+1

该op特别说'我不想把所有的对象放到一个列表中。'他想要连续写下他们。 – 2016-12-26 16:30:19

+0

@Nick:这可能是真的,但是OP没有说他们不想把它们放在一个“元组”中。 – martineau 2018-01-16 00:37:51

相关问题