一个个人收支管理系统作为综合案例,这个案例既贴近生活、实用性强,又能覆盖 Python 的核心知识点:变量、数据类型、函数、循环、条件判断、文件操作、异常处理等。
一、案例思路
设计功能菜单,让用户可以选择记账、查看账单、导出账单、退出系统等操作
使用列表 + 字典存储每一笔收支记录(包含时间、类型、金额、备注)
实现收支记录的增删查改
将账单数据持久化到文件(txt 格式),确保程序退出后数据不丢失
加入异常处理,防止用户输入非数字金额等错误操作
对账单进行简单的统计分析(总收入、总支出、结余)
import datetime
# 全局变量,存储所有收支记录
records = []
def load_records():
"""从文件加载收支记录"""
try:
with open("expense_records.txt", "r", encoding="utf-8") as f:
for line in f:
# 去除换行符并按分隔符拆分
line = line.strip()
if not line:
continue
date, type_, amount, remark = line.split("|")
records.append({
"date": date,
"type": type_,
"amount": float(amount),
"remark": remark
})
print(" 历史账单加载成功!")
except FileNotFoundError:
print(" 未找到历史账单文件,将创建新文件")
except Exception as e:
print(f" 加载账单失败:{e}")
def save_record(record):
"""保存单条记录到文件"""
try:
with open("expense_records.txt", "a", encoding="utf-8") as f:
line = f"{record['date']}|{record['type']}|{record['amount']}|{record['remark']}\n"
f.write(line)
return True
except Exception as e:
print(f" 保存记录失败:{e}")
return False
def add_record():
"""添加收支记录"""
print("\n===== 新增收支记录 =====")
# 获取收支类型
while True:
type_ = input("请输入收支类型(收入/支出):").strip()
if type_ in ["收入", "支出"]:
break
print(" 输入错误!请输入'收入'或'支出'")
# 获取金额(异常处理)
while True:
try:
amount = float(input("请输入金额:").strip())
if amount <= 0:
print(" 金额必须大于0!")
continue
break
except ValueError:
print(" 金额必须是数字!请重新输入")
# 获取备注
remark = input("请输入备注(可选):").strip() or "无备注"
# 生成记录
current_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
record = {
"date": current_date,
"type": type_,
"amount": amount,
"remark": remark
}
# 保存记录
if save_record(record):
records.append(record)
print(" 记录添加成功!")
def view_records():
"""查看所有收支记录"""
if not records:
print(" 暂无收支记录!")
return
print("\n===== 收支记录列表 =====")
print(f"{'序号':<5}{'时间':<20}{'类型':<6}{'金额':<10}{'备注'}")
print("-" * 60)
total_income = 0 # 总收入
total_expense = 0 # 总支出
for idx, record in enumerate(records, 1):
print(f"{idx:<5}{record['date']:<20}{record['type']:<6}{record['amount']:<10.2f}{record['remark']}")
if record['type'] == "收入":
total_income += record['amount']
else:
total_expense += record['amount']
print("-" * 60)
print(
f" 统计:总收入 = {total_income:.2f} 元,总支出 = {total_expense:.2f} 元,结余 = {total_income - total_expense:.2f} 元")
def export_records():
"""导出账单到CSV文件(更易读的格式)"""
if not records:
print(" 暂无收支记录可导出!")
return
try:
filename = f"收支账单_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
with open(filename, "w", encoding="utf-8-sig") as f:
# 写入表头
f.write("序号,时间,类型,金额,备注\n")
for idx, record in enumerate(records, 1):
f.write(f"{idx},{record['date']},{record['type']},{record['amount']:.2f},{record['remark']}\n")
print(f" 账单已导出为:{filename}(可直接用Excel打开)")
except Exception as e:
print(f" 导出失败:{e}")
def main_menu():
"""主菜单"""
print("\n===== 个人收支管理系统 =====")
print("1. 新增收支记录")
print("2. 查看所有记录")
print("3. 导出账单到CSV")
print("4. 退出系统")
while True:
try:
choice = int(input("\n请输入操作序号(1-4):").strip())
if choice == 1:
add_record()
elif choice == 2:
view_records()
elif choice == 3:
export_records()
elif choice == 4:
print(" 感谢使用,再见!")
break
else:
print(" 输入错误!请输入1-4之间的数字")
except ValueError:
print(" 请输入有效的数字!")
# 程序入口
if __name__ == "__main__":
# 先加载历史记录
load_records()
# 启动主菜单
main_menu()
三、代码关键部分解释
文件操作:
load_records():启动程序时从expense_records.txt加载历史记录,处理文件不存在的异常
save_record():新增记录时追加写入文件,确保数据持久化
export_records():将账单导出为 CSV 格式,方便用 Excel 打开查看
异常处理:
金额输入时捕获ValueError,防止用户输入非数字
文件操作时捕获通用异常,避免程序崩溃
数据存储:
使用列表records存储所有收支记录,每个记录是一个字典,包含时间、类型、金额、备注
时间通过datetime模块自动生成,确保记录的时效性
交互逻辑:
主菜单循环展示,直到用户选择退出
输入验证确保用户只能输入指定范围内的内容
总结
这个案例覆盖了 Python 核心知识点:函数、循环、条件判断、文件操作、异常处理、数据类型(列表 / 字典)、第三方模块(datetime)。
实现了 “数据持久化”,程序退出后重新运行仍能看到历史记录。
具备完善的用户交互和输入验证,符合实际应用场景的需求。