【问题标题】:Load all pickled objects [duplicate]加载所有腌制对象[重复]
【发布时间】:2018-08-21 23:52:18
【问题描述】:
import pickle

ListNames = [["Name1","City1","Email1"],["Name2","City2","Number2"]]
ListNumbers = [1,2,3,4,5,6,7,8]

with open ("TestPickle.pickle","wb") as fileSaver:
    pickle.dump(ListNames,fileSaver)
    pickle.dump(ListNumbers,fileSaver)

with open ("TestPickle.pickle","rb") as fileOpener:
    print(pickle.load(fileOpener))

输出是:

[['Name1', 'City1', 'Email1'], ['Name2', 'City2', 'Number2']]

如何让 pickle 也加载 ListNumbers

我知道我可以再次打印pickle.load,但是如果我的pickle文件中有未知数量的项目,并且具有多种数据类型(例如:列表、元组、字典、字符串......)

谢谢

【问题讨论】:

  • 通常,如果你想保存多个对象,你会腌制一个包含所有对象的列表(或其他容器)。如果这不切实际(例如,对象太大而无法同时放入内存中),您可以将对象的数量存储为文件中的第一件事,或者只是继续 unpickling 直到遇到 EOF 异常。
  • while True: try:....except EOFError: break?

标签: python pickle


【解决方案1】:

以前没有尝试过像这样在 pickle 文件中放入多个东西,但很高兴看到它是可能的。看this的回答。如果您在没有with 的情况下调用它两次,它应该会输出所有内容:

f = open("TestPickle.pickle", "r")
ListNames = pickle.load(f)
ListNumbers = pickle.load(f)
f.close()

或者您可以像这样保留with

with open("TestPickle.pickle", "rb") as f:
    ListNames,ListNumbers = pickle.load(f)

那么,

如果我的 pickle 文件中有未知数量的项目,并且具有多种数据类型,该怎么办

将一些东西倒入泡菜文件中,这样你就不再知道里面有什么了,这真的是一个聪明的主意吗?

【讨论】:

  • 谢谢。我的目标是解开未定义数量的包装物品。下面有人建议使用 try/except 进行 while 循环 :)
  • 是的,应该可以工作,except 也允许它在没有错误消息的情况下结束。
【解决方案2】:

我不确定这是否是正确的方法。

import pickle

ListNames = [["Name1","City1","Email1"],["Name2","City2","Number2"]]
ListNumbers = [1,2,3,4,5,6,7,8]

with open ("TestPickle.pickle","wb") as fileSaver:
    pickle.dump(ListNames,fileSaver)
    pickle.dump(ListNumbers,fileSaver)
obj = []
with open("TestPickle.pickle","rb") as fileOpener:
    while True:
        try:
            obj.append(pickle.load(fileOpener))
        except EOFError:
            break
print obj

输出:

[[['Name1', 'City1', 'Email1'], ['Name2', 'City2', 'Number2']], [1, 2, 3, 4, 5, 6, 7, 8]]

【讨论】:

    【解决方案3】:

    我知道我可以再次打印pickle.load,但是如果我的pickle文件中有未知数量的项目,并且具有多种数据类型(例如:列表、元组、字典、字符串......)

    有几种方法可以解决这个问题:

    1. 将所有项目打包到一个列表或元组中,然后腌制而不是单独腌制它们。然后你就可以在另一边打开包装了。
    2. 首先腌制一个描述项目数的整数。然后,它会告诉您拨打pickle.load() 的次数。
    3. 继续解酸,直到达到 EOF。

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多