【问题标题】:Loading all objects of a dictionary from a pickle file从泡菜文件加载字典的所有对象
【发布时间】:2014-08-03 00:29:48
【问题描述】:

我有我的程序设置,所以它接受用户输入并从中创建一个对象。然后将对象存储在字典中,然后将其腌制为 .pkl 文件。写入此文件的任何新对象都使用此代码:

def save_object(obj, filename):
    with open(filename, 'ab') as output:
        pickle.dump(obj, output, -1)

现在,当我重新打开程序时,我需要加载字典的全部内容,我试图这样做:

self.load_file = open("Obj_file.pkl", 'rb+')
self.employee_dict = pickle.load(self.load_file)
print self.employee_dict

现在据我了解,这只会加载前两个对象,这实际上是我在运行代码时看到的结果。它只打开前两个对象。我如何加载整个字典,考虑到我所做的研究,这似乎相当困难。此外,我使用字典对我的程序至关重要,因为对象将从字典中删除,并且在执行此过程后我需要命令保持不变。

【问题讨论】:

  • dicts 没有任何顺序,如果你想要顺序使用列表
  • 我知道,我的意思是我按顺序创建我的密钥,例如如果我有对象 1-3 并且我删除了键 2,我希望其他键保持不变。抱歉,如果不清楚
  • 你是存储多个字典还是只存储一个?
  • 我只存储一个。
  • 如果您只是腌制和加载单个字典,那么问题出在哪里?

标签: python python-2.7 object dictionary pickle


【解决方案1】:

你在追加模式中打开了你的pickle文件;这会在文件末尾写入一个 new pickle 记录,将您的第一个版本留在开头。

然后,当您在重新打开程序时从文件中读取泡菜时,您只会读取第一个版本。

根据您的需要,以 write 模式打开文件要简单得多,每次都用新版本的字典替换所有内容:

def save_object(obj, filename):
    with open(filename, 'wb') as output:
        pickle.dump(obj, output, -1)

【讨论】:

  • 是的,我明白了,当我以写入模式打开时,尽管每次我在重新打开脚本时创建一个新对象时,它都会覆盖以前的 .pkl,并且我会丢失存储的对象。跨度>
  • @After_Sunset:但是你写给泡菜的应该是你的整个状态。因此,如果您有字典,请添加到该字典,然后将该字典的新版本写入文件。
  • @After_Sunset:换句话说:您的文件包含您的字典的旧版本。您的程序现在已经修改了该字典,因此您想用新版本替换文件中的版本。
  • 我明白你的意思,但我相信我的代码已经这样设置了。当我保存新版本时,它只会覆盖旧版本。它似乎没有添加只是覆盖。
  • @After_Sunset:不,您的原始代码使用ab,或二进制附加模式。这会在当前泡菜数据 之后写入泡菜数据。 pickle 模块只会读取第一条记录,忽略后面的任何数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多