返回

Python构建个人开销追踪器:实战指南与代码详解

python

构建个人开销追踪器:Python实战指南

个人开销追踪器能有效帮助用户记录日常支出,了解资金流向并控制预算。本文将详细介绍如何用 Python 构建一个功能完善的开销追踪器,涵盖添加开销、查看开销、设置预算、保存和加载数据以及创建交互式菜单等核心功能。

一、 添加开销

功能 提示用户输入开销明细,包括日期、类别、金额和,并将每笔开销以字典形式存储在列表中。

实现步骤:

  1. 定义一个 add_expense() 函数,用于获取用户输入的开销信息。
  2. 使用 input() 函数提示用户输入日期(格式为YYYY-MM-DD)、类别、金额和。
  3. 对用户输入的金额进行校验,确保其为有效数字。
  4. 将获取的信息存储为字典,并添加到开销列表。

代码示例:

import datetime
import csv

expenses = []

def add_expense():
    while True:
        date_str = input("请输入开销日期 (YYYY-MM-DD): ")
        try:
            date = datetime.datetime.strptime(date_str, "%Y-%m-%d").date()
            break
        except ValueError:
            print("日期格式错误,请重新输入.")

    category = input("请输入开销类别 (例如 Food, Travel): ")
    while True:
        amount_str = input("请输入开销金额: ")
        try:
            amount = float(amount_str)
            if amount < 0:
                raise ValueError
            break
        except ValueError:
            print("金额无效,请输入非负数字.")
    description = input("请输入开销描述: ")
    expenses.append({'date': date, 'category': category, 'amount': amount, 'description': description})
    print("开销已添加.")

这段代码首先会校验日期的合法性,避免了无效的日期输入;其次会对金额做非负校验,提高了程序的健壮性。

二、 查看开销

功能描述: 检索并显示所有已存储的开销记录,并对数据进行有效性验证。

实现步骤:

  1. 定义一个 view_expenses() 函数。
  2. 遍历开销列表,逐条显示每笔开销的日期、类别、金额和描述。
  3. 在显示数据前,验证每条开销记录是否包含所有必需的字段(日期、类别、金额和描述)。 如果有缺失,则跳过该条记录或告知用户数据不完整。

代码示例:

def view_expenses():
    if not expenses:
        print("暂无开销记录.")
        return

    print("--- 开销记录 ---")
    for expense in expenses:
        if all(key in expense for key in ['date', 'category', 'amount', 'description']):
            print(f"日期: {expense['date']}, 类别: {expense['category']}, 金额: {expense['amount']}, 描述: {expense['description']}")
        else:
            print("发现不完整的开销记录,已跳过。")
    print("--- 结束 ---")

三、 设置和跟踪预算

功能描述: 允许用户设置每月预算,并计算已记录的总开销,与预算进行比较并给出提示。

实现步骤:

  1. 定义一个 set_budget() 函数,提示用户输入每月预算金额。
  2. 定义一个 track_budget() 函数,计算当前已记录的总开销。
  3. 比较总开销与预算,如果超出预算则显示警告,否则显示剩余可用金额。

代码示例:

budget = 0.0

def set_budget():
    global budget
    while True:
        budget_str = input("请输入每月预算: ")
        try:
            budget = float(budget_str)
            if budget <= 0:
                raise ValueError
            print(f"每月预算已设置为: {budget}")
            break
        except ValueError:
            print("预算金额无效,请输入正数.")

def track_budget():
    if budget == 0.0:
        print("请先设置预算.")
        return

    total_expenses = sum(expense['amount'] for expense in expenses)
    remaining_budget = budget - total_expenses

    print(f"当前总开销: {total_expenses}")
    if remaining_budget < 0:
        print("警告: 您已超出预算!")
    else:
        print(f"您本月还剩余: {remaining_budget}")

四、 保存和加载开销

功能描述: 将所有开销保存到 CSV 文件,并在程序启动时从 CSV 文件加载开销数据。

实现步骤:

  1. 定义一个 save_expenses() 函数,将开销数据保存到 CSV 文件。每行数据包含日期、类别、金额和描述。
  2. 定义一个 load_expenses() 函数,从 CSV 文件加载开销数据。程序启动时调用此函数读取数据并填充开销列表。

代码示例:

EXPENSE_FILE = 'expenses.csv'

def save_expenses():
    with open(EXPENSE_FILE, 'w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=['date', 'category', 'amount', 'description'])
        writer.writeheader()
        writer.writerows(expenses)
    print(f"开销已保存到 {EXPENSE_FILE}")

def load_expenses():
    global expenses
    try:
        with open(EXPENSE_FILE, 'r', newline='', encoding='utf-8') as file:
            reader = csv.DictReader(file)
            for row in reader:
                try:
                    row['date'] = datetime.datetime.strptime(row['date'], "%Y-%m-%d").date()
                    row['amount'] = float(row['amount'])
                    expenses.append(row)
                except (ValueError, KeyError) as e:
                    print(f"加载数据时遇到错误: {e}, 已跳过该行。")
                    continue
        print("已从文件加载开销数据.")
    except FileNotFoundError:
        print("未找到保存的开销数据文件.")

load_expenses 函数增加了异常处理部分,如果加载数据过程中出现格式错误,会打印错误信息并跳过该行,提高了程序的容错性。

五、 创建交互式菜单

功能描述: 显示一个交互式菜单,允许用户选择不同的操作。

实现步骤:

  1. 定义一个 display_menu() 函数,显示操作选项。
  2. 提示用户输入选项编号并进行响应,根据用户选择调用相应的功能函数。

代码示例:

def display_menu():
    print("\n--- 开销追踪器菜单 ---")
    print("1. 添加开销")
    print("2. 查看开销")
    print("3. 跟踪预算")
    print("4. 保存开销")
    print("5. 退出")

    while True:
        choice = input("请输入您的选择 (1-5): ")
        try:
            choice = int(choice)
            if 1 <= choice <= 5:
                return choice
            else:
                print("无效选择,请输入 1-5 之间的数字。")
        except ValueError:
            print("无效输入,请输入数字。")

if __name__ == "__main__":
    load_expenses()
    while True:
        choice = display_menu()
        if choice == 1:
            add_expense()
        elif choice == 2:
            view_expenses()
        elif choice == 3:
            if budget == 0.0 :
               set_budget()
            track_budget()
        elif choice == 4:
            save_expenses()
        elif choice == 5:
            save_expenses()
            print("退出程序.")
            break

这段代码在程序启动时会首先调用 load_expenses() 加载已保存的数据;在退出程序之前,会调用save_expenses确保数据被保存。 另外,display_menu() 函数增加了输入校验,保证用户输入的是有效的数字选项。

至此,一个具备基本功能的个人开销追踪器就完成了。 通过这个项目,你不仅掌握了 Python 的基础知识,还了解了如何将这些知识应用到实际问题的解决中。

相关资源链接:

希望这些