如果 pickle 文件中不存在对象,则创建新对象,如果存在则加载它(多个对象的最佳方式?)

Create new object if object doesn't exist in pickle file and load it if it does (best way with multiple objects?)

我知道如何对 pickle 文件中的单个对象或缺少单个对象执行此操作,但我不知道如果 pickle 文件中缺少 1 个以上的对象如何执行此操作。

我现在得到的:

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文件中每个对象的语句,这将导致大量代码)。

Pickle 文件是顺序写入的。由于对象的 pickle 的长度可能会有所不同,因此通常不可能在现有文件中将一个 pickle 替换为另一个 pickle,就像您不能用更长的文本文件替换文本文件中的短行一样。

您现有的代码将相同的 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]