我知道如何对泡菜文件中的单个对象或缺少单个对象执行此操作,但是如果泡菜文件中缺少多个对象,我不知道如何执行此操作。
我现在得到的是:
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语句在文件中,这将导致大量的代码。
答案 0 :(得分:3)
Pickle文件是顺序写入的。由于对象的泡菜的长度可以变化,因此通常无法用一个现有文件内的其他位置替换一个泡菜,这比将文本文件中的一小行替换成更长的文本更重要。
您现有的代码将相同的泡菜读入user1
,user2
和user3
中,所以我不确定如何从完全相同的表达式中获得不同的值。
请考虑使用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]