完善Python财务跟踪计划

时间:2018-01-16 04:24:24

标签: python function loops dictionary

我正在努力创建一个追踪退休财务的基本计划。我到目前为止得到的东西输入一个条目并存储它。下次运行时,先前的值会被清除掉。理想情况下,我想要的是一个无限期附加到列表中的程序,如果我从现在开始打开它,我希望能够以dict格式查看当前数据,再加上它。我设想运行脚本,输入帐户名称和余额然后关闭它,并在以后再次执行

几个问题:

  1. 我如何实现这一目标?我想我需要一些循环概念来实现目标
  2. 是否有更优雅的方式输入帐户名称和余额,而不是像下面的参数那样对其进行硬编码?我尝试了输入(),但它只运行帐户名称,而不是平衡(再次,可能与循环相关)
  3. 我想添加一些错误检查,因此如果用户没有输入有效帐户,请说(HSA,401k或Roth),系统会提示他们重新输入。输入/检查应该在哪里发生?
  4. 谢谢!

    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)
    

1 个答案:

答案 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的代码并将其放在辅助函数中,因为我们使用相同的代码两次。

祝你好运!