【问题标题】:pickle - putting more than 1 object in a file? [duplicate]pickle - 在文件中放置超过 1 个对象? [复制]
【发布时间】:2013-03-05 23:54:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么将它们全部放在一个列表中会出现问题?

标签: python file pickle


【解决方案1】:

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

【讨论】:

  • 该操作明确表示“我不想将所有对象放入一个列表中。”他想按顺序写。
  • @Nick:这可能是真的,但是 OP 并没有说他们不想把它们放在 tuple 中。
【解决方案2】:

如果你将文件句柄直接传递给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 的工作原理相同。

【讨论】:

【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2014-10-27
    • 2010-12-23
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多