我正在努力创建一个追踪退休财务的基本计划。我到目前为止得到的东西输入一个条目并存储它。下次运行时,先前的值会被清除掉。理想情况下,我想要的是一个无限期附加到列表中的程序,如果我从现在开始打开它,我希望能够以dict格式查看当前数据,再加上它。我设想运行脚本,输入帐户名称和余额然后关闭它,并在以后再次执行
几个问题:
谢谢!
from datetime import datetime
Account = {
"name": [],
"month": [],
"day": [],
"year": [],
"balance": []
}
finance = [Account]
def finance_data(name, month, day, year, balance):
Account['name'].append(name)
Account['month'].append(month)
Account['day'].append(day)
Account['year'].append(year)
Account['balance'].append(balance)
print(finance)
finance_data('HSA',
datetime.now().month,
datetime.now().day,
datetime.now().year,
500)
答案 0 :(得分:2)
当您运行脚本并将值放入代码中定义的变量时,这些值只会持续程序运行很长时间。每次运行脚本时,它都将从代码中定义的初始状态重新开始,因此,不会保留上次运行脚本时的状态。
您需要的是持久数据,它超出了脚本的运行时间。通常,我们通过创建数据库,使用脚本将新数据写入数据库来完成此操作,然后,当脚本下次运行时,从数据库中读取旧值以记住过去发生的事情。但是,由于您的用例较小,因此可能不需要完整的数据库系统。相反,我建议将数据写入文本文件,然后从文本文件中读取以获取旧数据。你可以这样做:
# read about file io in python here: https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files
dataStore = open("dataFile.txt", "r+") # r+ is the read and write mode
def loadDataToAccount(dataStore):
Account = {
"name": [],
"month": [],
"day": [],
"year": [],
"balance": []
}
for line in dataStore.read().splitlines():
(name, month, day, year, balance) = line.split("|")
Account['name'].append(name)
Account['month'].append(month)
Account['day'].append(day)
Account['year'].append(year)
Account['balance'].append(balance)
return Account
Account = loadDataToAccount(dataStore)
这里我假设我们组织文本文件,以便每一行都是一个条目,条目是" |"分开如: 鲍勃| 12 | 30 | 1994 | 500 抢劫| 11 | 29 | 1993 | 499
因此,我们可以将文本解析为Account字典。现在,让我们看一下将数据输入文本文件:
def addData(Account, dataStore):
name = raw_input("Enter the account name: ")
balance = raw_input("Enter the account balance: ")
# put name and balance validation here!
month = datetime.now().month
day = datetime.now().day
year = datetime.now().year
# add to Account
Account['name'].append(name)
Account['month'].append(month)
Account['day'].append(day)
Account['year'].append(year)
Account['balance'].append(balance)
# also add to our dataStore
dataStore.write(name + "|" + month + "|" + day + "|" + year + "|" + balance + "\n")
addData(Account, dataStore)
请注意我是如何使用我定义的读取格式将其写入dataStore的。如果不将其写入文本文件,它将不会保存数据并在下次运行时可用。
另外,我使用输入来获取名称和平衡,以便它更具动态性。收集输入后,您可以放置一个if语句以确保它是一个有效的名称,然后使用某种while循环结构来继续询问名称,直到它们输入有效名称。
您可能希望提取将值添加到Account的代码并将其放在辅助函数中,因为我们使用相同的代码两次。
祝你好运!