我有一个方法将大量腌制对象(实际上是元组)转储到文件中。泡菜 - 把一个以上的对象放在一个文件中?
我不想把它们放到一个列表,我真的想好几次转储到同一个文件。 我的问题是,我如何再次加载对象? 第一个和第二个对象只有一条线,所以这对readlines起作用。 但所有其他人都更长。 自然,如果我尝试
myob = cpickle.load(g1.readlines()[2])
,其中G1是文件,我得到一个EOF错误,因为我的腌制对象是大于一行。 有没有办法让我的酸菜对象?
我有一个方法将大量腌制对象(实际上是元组)转储到文件中。泡菜 - 把一个以上的对象放在一个文件中?
我不想把它们放到一个列表,我真的想好几次转储到同一个文件。 我的问题是,我如何再次加载对象? 第一个和第二个对象只有一条线,所以这对readlines起作用。 但所有其他人都更长。 自然,如果我尝试
myob = cpickle.load(g1.readlines()[2])
,其中G1是文件,我得到一个EOF错误,因为我的腌制对象是大于一行。 有没有办法让我的酸菜对象?
不要试图阅读他们回来的文件的行,你要的对象只是pickle.load()
数量。请参阅我对How to save an object in Python问题的回答,以获取相关示例。
如果直接通过文件句柄到泡菜,你可以得到你想要的结果。
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
的工作原理相同。
另请参阅此答案阅读多个泡菜的答案。 [数据保存和蟒蛇泡菜文件中加载多个对象(http://stackoverflow.com/questions/20716812/saving-and-loading-multiple-objects-in-python-pickle-file) – salomonvh 2015-09-28 12:17:32
这是否也与cPickle的工作吗? (显然不是......) – DreamFlasher 2017-02-27 09:15:34
我认为最好的办法是将数据打包成一个对象,然后存放好,并加载它后解压。下面是使用 一个例子的元组作为容器(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)
该op特别说'我不想把所有的对象放到一个列表中。'他想要连续写下他们。 – 2016-12-26 16:30:19
@Nick:这可能是真的,但是OP没有说他们不想把它们放在一个“元组”中。 – martineau 2018-01-16 00:37:51
为什么把他们都在一个列表中的一个问题? – 2013-03-17 17:24:13