【发布时间】:2019-03-25 09:19:00
【问题描述】:
我编写了一个脚本,将支出和收入的类实例存储在列表中。
第一次启动模块时,我使用 try/except 块来检查腌制文件:
try:
#list definitions
expenselist = pickle.load(open(filename,'rb'))
incomelist = pickle.load(open(filename,'rb'))
except:
print ("Generating new lists.")
#list definitions
expenselist = []
incomelist = []
这在 IDLE 中运行时按预期工作: test-slide-1
程序打印有关生成新列表的调试消息并打印空白列表。然后它提示用户输入以创建附加到空列表的类实例。
enterValue = str(input("Hi, press 1 to enter income and 2 to expense"))
try:
if enterValue == '1':
addIncome ()
#printRev()#debug to print class
elif enterValue == '2':
addExpense ()
#printExp() #debug to print class
else:
raise ValueError
except ValueError:
print ("Incorrect Value.")
这会在 IDLE 中产生以下结果: test-slide-2
然后使用以下方法腌制:
#pickle expenselist
pickle.dump(expenselist,open(filename,'wb'))
#pickle incomelist
pickle.dump(incomelist,open(filename,'wb'))
腌制的数据存储在这里: file_structure
当我使用 Notepad++ 打开这个文件时,我得到了这个:
€]q。
所以我知道它存储了一些东西。
到目前为止,一切都按设计进行,但是当我再次运行脚本时,我得到: test-slide-3
我没有打印关于生成新列表的调试消息,所以我知道它检测到并尝试加载文件,但它打印的是空白列表,而不是我在上一次会话期间存储在列表中的数据。
我已经尝试了几个星期来弄清楚发生了什么。我最初认为它是保存类实例的位置而不是实例本身,但如果是这种情况,它应该打印实例的地址。相反,我得到的是空白列表。
我的问题是:1,无论加载泡菜,它是否都会生成新列表,我该如何停止它? 2,如果这不是问题,那是什么?
我大约有 50% 是自学成才的,而且我已经用尽了我所知道的资源。我让两个程序员看了一下代码,但都不是 Python 专家。所以这是我唯一没有尝试过的。
【问题讨论】:
-
我相信您转储的
incomelist将覆盖您之前转储的expenselist,因为您使用w标志重新打开同一个文件,根据文档将:@987654331 @。同样,您的load语句会重新打开同一个文件,从而将文件重新设置到开头。 -
所以我需要将列表存储在两个不同的文件中?
-
不,只需打开文件一次,如@progmatico 提供的答案所示。
标签: python python-3.x persistence pickle