You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

188 lines
5.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
个人财务管理系统
作者:[你的名字]
日期2026年1月7日
"""
import json
from datetime import datetime
# 全局变量
records = [] # 存储所有收支记录
categories = ['餐饮', '交通', '购物', '娱乐', '工资', '奖金', '其他'] # 收支类别
def load_data():
"""从文件加载数据"""
global records
try:
with open('finance_data.json', 'r', encoding='utf-8') as f:
records = json.load(f)
print("历史数据加载成功!")
except FileNotFoundError:
print("未找到历史数据,将创建新文件。")
records = []
def save_data():
"""保存数据到文件"""
with open('finance_data.json', 'w', encoding='utf-8') as f:
json.dump(records, f, ensure_ascii=False, indent=2)
print("数据已保存!")
def add_record():
"""添加收支记录"""
print("\n--- 添加收支记录 ---")
# 输入数据
amount = float(input("请输入金额(正数为收入,负数为支出):"))
print("可选类别:")
for i, cat in enumerate(categories, 1):
print(f"{i}. {cat}")
cat_choice = int(input("请选择类别编号:"))
category = categories[cat_choice - 1] if 1 <= cat_choice <= len(categories) else "其他"
note = input("请输入备注(可选):")
# 创建记录字典
record = {
'id': len(records) + 1,
'date': datetime.now().strftime("%Y-%m-%d %H:%M"),
'amount': amount,
'category': category,
'note': note
}
records.append(record)
print(f"记录添加成功ID{record['id']}")
def query_records():
"""查询收支记录"""
print("\n--- 查询记录 ---")
print("1. 查看所有记录")
print("2. 按日期查询")
print("3. 按类别查询")
choice = input("请选择查询方式:")
if choice == '1':
display_records(records)
elif choice == '2':
date_str = input("请输入日期YYYY-MM-DD")
filtered = [r for r in records if r['date'].startswith(date_str)]
display_records(filtered)
elif choice == '3':
print("可选类别:")
for i, cat in enumerate(categories, 1):
print(f"{i}. {cat}")
cat_choice = int(input("请选择类别编号:"))
if 1 <= cat_choice <= len(categories):
filtered = [r for r in records if r['category'] == categories[cat_choice - 1]]
display_records(filtered)
def display_records(record_list):
"""显示记录列表"""
if not record_list:
print("没有找到相关记录。")
return
print(f"\n共找到 {len(record_list)} 条记录:")
print("-" * 60)
print(f"{'ID':<5}{'日期':<20}{'类别':<10}{'金额':<15}{'备注'}")
print("-" * 60)
total_income = 0
total_expense = 0
for record in record_list:
amount = record['amount']
if amount > 0:
total_income += amount
else:
total_expense += abs(amount)
print(f"{record['id']:<5}{record['date']:<20}"
f"{record['category']:<10}{amount:<15.2f}{record['note']}")
print("-" * 60)
print(f"总收入:{total_income:.2f} | 总支出:{total_expense:.2f} | 结余:{total_income - total_expense:.2f}")
def statistics():
"""统计报表功能"""
if not records:
print("暂无数据可统计。")
return
print("\n--- 财务统计报表 ---")
# 计算各类别支出
expense_by_category = {}
income_total = 0
expense_total = 0
for record in records:
amount = record['amount']
category = record['category']
if amount > 0:
income_total += amount
else:
expense_total += abs(amount)
if category not in expense_by_category:
expense_by_category[category] = 0
expense_by_category[category] += abs(amount)
# 显示统计结果
print(f"记录总数:{len(records)}")
print(f"总收入:{income_total:.2f}")
print(f"总支出:{expense_total:.2f}")
print(f"净结余:{income_total - expense_total:.2f}")
print("\n支出类别分布:")
if expense_by_category:
for category, amount in expense_by_category.items():
percentage = (amount / expense_total * 100) if expense_total > 0 else 0
print(f" {category}: {amount:.2f} ({percentage:.1f}%)")
def main_menu():
"""主菜单"""
load_data() # 启动时加载数据
while True:
print("\n" + "=" * 50)
print(" 个人财务管理系统")
print("=" * 50)
print("1. 添加收支记录")
print("2. 查询记录")
print("3. 财务统计")
print("4. 保存数据")
print("5. 退出系统")
choice = input("\n请选择操作1-5")
if choice == '1':
add_record()
elif choice == '2':
query_records()
elif choice == '3':
statistics()
elif choice == '4':
save_data()
elif choice == '5':
save_data()
print("感谢使用,再见!")
break
else:
print("输入无效,请重新选择。")
# 程序入口
if __name__ == "__main__":
main_menu()