如果泡菜文件中不存在对象,则创建新对象;如果泡菜文件中不存在对象,则将其加载(最好的方法是使用多个对象?)

时间:2019-02-07 12:24:26

标签: python pickle

我知道如何对泡菜文件中的单个对象或缺少单个对象执行此操作,但是如果泡菜文件中缺少多个对象,我不知道如何执行此操作。

我现在得到的是:

try:
    user1 = pickle.load(open("users.pkl", "rb"))
except (OSError, IOError) as e:
    user1 = users("user1")
    pickle.dump(user1, open("users.pkl", "wb"))

我想要实现的目标:

try:
    user1 = pickle.load(open("users.pkl", "rb"))
    user2 = pickle.load(open("users.pkl", "rb"))
    user3 = pickle.load(open("users.pkl", "rb"))
except (OSError, IOError) as e:
    if if 'user1' not in locals():
        user1 = users("user1")
        pickle.dump(user1, open("users.pkl", "wb"))
    if if 'user2' not in locals():
        user2 = users("user2")
        pickle.dump(user2, open("users.pkl", "wb"))
    if if 'user3' not in locals():
        user3 = users("user3")
        pickle.dump(user3, open("users.pkl", "wb"))

此问题是,如果'user1'不存在而'user2'却存在,则它看起来很混乱并且不能正常工作(因为它立即变为异常)。有没有更好,更pythonic的方式来做这样的事情? AFAIK python文档告诉我们try语句是处理此类问题的方法,但是正如您在上面看到的那样,我不知道如何正确实现此想法(除非我会为每个对象使用单独的try语句在文件中,这将导致大量的代码。

1 个答案:

答案 0 :(得分:3)

Pickle文件是顺序写入的。由于对象的泡菜的长度可以变化,因此通常无法用一个现有文件内的其他位置替换一个泡菜,这比将文本文件中的一小行替换成更长的文本更重要。

您现有的代码将相同的泡菜读入user1user2user3中,所以我不确定如何从完全相同的表达式中获得不同的值。

请考虑使用shelve模块,该模块在许多方面都类似于磁盘上的字典,并且使您可以非常轻松地测试特定键的存在或不存在。

以下一些代码应该给您提示如何进行操作:

>>> with shelve.open("my_database") as db:
...     db["user1"] = [1, 2, 3]
...     db["user2"] = [2, 3, 4]
...
>>> with shelve.open("my_database") as db:
...     if "user1" in db:
...         print(db["user1"])
...     else:
...         print("Entry needs creating!")
...
[1, 2, 3]