加载所有的pickle对象

3
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文件中有未知数量的项目和多种数据类型(例如:列表、元组、字典、字符串等),该怎么办?

谢谢。


通常,如果您想保存多个对象,您可以使用pickle将所有对象存储在列表(或其他容器)中。如果这不可行(例如,对象太大而无法同时放入内存),您可以将对象计数作为文件中的第一件事进行存储,或者只需继续取消选择,直到收到EOF异常。 - jasonharper
当为真时:尝试:....除了EOFError:打破 - juanpa.arrivillaga
3个回答

1

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

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]]

0

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

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

  1. 将所有项目打包成单个列表或元组,并将其pickle而不是逐个pickle它们。然后你可以在另一边解包。
  2. 首先pickle一个描述项目数量的整数。然后告诉你调用pickle.load()的次数。
  3. 只需继续反pickle直到遇到EOF为止。

0

以前没有尝试过像那样在一个 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文件中有未知数量的项目和多种数据类型,该怎么办?

把东西倒进pickle文件里,这样你就不知道里面有什么,真的是个聪明的主意吗?


谢谢。我旨在反序列化未定义数量的打包项。下面有人建议使用带有try/except的while循环 :) - user4948958
是的,那应该可以工作,except 语句使其在不出现错误消息的情况下也能到达结尾。 - cardamom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接