Python 零基础入门系列(终篇):综合实战项目

发布时间:2026/6/22 23:13:37

Python 零基础入门系列(终篇):综合实战项目 Python 零基础入门系列终篇综合实战项目《代码之钥》—— 个人记账管理系统Personal Accounting Manager 系列说明恭喜你来到本系列的收官之作在前十三篇中我们从基础语法到函数从文件操作到异常处理你已经掌握了 Python 的“十八般兵器”。俗话说“纸上得来终觉浅绝知此事要躬行。”本文将带你把前 13 篇学到的所有知识语法、函数、模块、文件、异常等融合在一起从零开始开发一个完整的“个人记账管理系统”。这不仅是一个项目更是你迈向 Python 开发者之路的“成人礼”。 更新时间2026 年 3 月 30 日 本篇你将学到项目需求分析、模块化设计、数据持久化、异常处理实战、面向过程的综合应用⏱️ 预计阅读时间60 分钟 | 实践时间90-120 分钟 前置知识已完成前十三篇所有内容✍️ 作者书到用时方恨少! 前言为什么要开发这个项目在前十三篇教程中我们写的代码大多是“碎片化”的。今天我们要把这些碎片拼成一幅完整的画卷。记账管理系统是一个经典的 CRUD增删改查应用Create (创建)添加一笔收入或支出。Read (读取)查看所有账单或按条件查询。Update (更新)修改账单信息。Delete (删除)删除错误账单。通过这个项目你将学会模块化思维如何把一个大程序拆分成多个小文件。数据持久化利用JSON模块将内存数据保存到硬盘。防御性编程利用try-except处理用户错误输入。工程化结构如何组织一个 Python 项目的目录。1. 项目需求分析1.1 核心功能启动加载程序启动时自动从文件加载历史账单。记账功能录入类型收入/支出。录入金额。录入分类如餐饮、交通、工资等。录入日期默认当前日期。录入备注。查询功能查看所有账单。按月份查询。按分类查询。统计功能显示当前余额、总收入和总支出。退出保存程序退出时自动保存数据。1.2 数据结构设计我们需要一个结构来存储每一笔“记录”{ id: 1, # 唯一标识 type: 支出, # 收入/支出 amount: 50.0, # 金额 category: 餐饮, # 分类 date: 2026-04-01, # 日期 note: 午餐 # 备注 }所有记录将存储在一个列表中并使用 JSON 格式保存在accounting.json文件中。1.3 技术栈回顾基础语法变量、数据类型字典、列表。流程控制if-else判断while循环。函数封装重复代码。模块json模块处理数据os模块检查文件。异常处理try-except捕获输入错误如输入非数字金额。2. 项目架构设计为了代码清晰我们将项目拆分为 4 个模块2.1 目录结构Personal_Accounting/ │ ├── data/ # 数据文件夹 │ └── accounting.json # 账单数据 │ ├── config.py # 配置文件常量 ├── file_utils.py # 文件读写模块 ├── logic.py # 业务逻辑模块核心算法 ├── ui.py # 用户界面模块输入输出 └── main.py # 主程序入口2.2 模块划分config.py定义常量如文件路径、记账类型。file_utils.py负责数据的加载Load和保存Save。logic.py负责数据的增删改查CRUD逻辑。ui.py负责展示菜单、接收用户输入。main.py负责程序的流程控制死循环直到用户退出。3. 核心代码实现3.1 数据模型与常量 (config.py)定义项目中会用到的常量避免“魔法数字”。# config.py import os # --- 基础配置 --- # 获取当前脚本所在目录 BASE_DIR os.path.dirname(os.path.abspath(__file__)) # 数据文件夹路径 DATA_DIR os.path.join(BASE_DIR, data) # 账单文件路径 ACCOUNT_FILE os.path.join(DATA_DIR, accounting.json) # --- 记账配置 --- # 记账类型 TYPES [收入, 支出] # 常用分类 CATEGORIES { 收入: [工资, 奖金, 理财, 兼职, 其他], 支出: [餐饮, 交通, 购物, 娱乐, 住房, 通讯, 医疗, 学习, 其他] }3.2 文件操作模块 (file_utils.py)利用json模块实现数据的持久化这里要处理文件不存在的异常。# file_utils.py import json import os from config import ACCOUNT_FILE, DATA_DIR def ensure_data_dir(): 确保数据目录存在 if not os.path.exists(DATA_DIR): os.makedirs(DATA_DIR) def load_data(): 从文件加载数据 Returns: 账单列表 ensure_data_dir() # 如果文件不存在返回空列表 if not os.path.exists(ACCOUNT_FILE): return [] try: with open(ACCOUNT_FILE, r, encodingutf-8) as f: data json.load(f) # 确保数据是列表格式 return data if isinstance(data, list) else [] except (json.JSONDecodeError, Exception) as e: print(f❌ 数据文件读取错误{e}。将创建新的空账本。) return [] def save_data(records): 保存数据到文件 Args: records (list): 账单列表 try: with open(ACCOUNT_FILE, w, encodingutf-8) as f: json.dump(records, f, ensure_asciiFalse, indent4) print(✅ 数据已自动保存) except Exception as e: print(f❌ 数据保存失败{e})3.3 业务逻辑模块 (logic.py)处理核心数据逻辑不涉及用户交互。# logic.py import json from datetime import datetime from config import TYPES def add_record(records, type_, amount, category, note, date_None): 添加一条记录 if date_ is None: date_ datetime.now().strftime(%Y-%m-%d) # 生成 ID取最大 ID 1如果没有数据则为 1 new_id max([r[id] for r in records] or [0]) 1 record { id: new_id, type: type_, amount: amount, category: category, date: date_, note: note } records.append(record) return True def delete_record(records, record_id): 删除记录 initial_len len(records) records[:] [r for r in records if r[id] ! record_id] return len(records) initial_len def query_records(records, monthNone, categoryNone): 查询记录支持过滤 result records if month: # 格式2026-04 result [r for r in result if r[date].startswith(month)] if category: result [r for r in result if r[category] category] return result def get_statistics(records): 统计数据 total_income sum(r[amount] for r in records if r[type] 收入) total_expense sum(r[amount] for r in records if r[type] 支出) balance total_income - total_expense return { total_income: total_income, total_expense: total_expense, balance: balance }3.4 用户交互界面 (ui.py)负责与用户“对话”这里大量使用try-except处理输入错误。# ui.py from logic import get_statistics from config import TYPES,CATEGORIES from file_utils import load_data def show_menu(): 显示主菜单 print(\n * 40) print( 欢迎使用个人记账管理系统) print( * 40) stats get_statistics(load_data()) # 这里为了演示实际应传入内存数据 print(f 当前余额{stats[balance]:.2f} (收入:{stats[total_income]:.2f} 支出:{stats[total_expense]:.2f})) print(- * 40) print(1. 添加记录) print(2. 查看所有记录) print(3. 按条件查询) print(4. ️ 删除记录) print(5. 退出系统) print(- * 40) def get_user_choice(): 获取用户选择 try: choice input( 请选择功能 (1-5): ).strip() return int(choice) except ValueError: return -1 # 无效输入 def input_record(): 交互式输入一条记录 while True: print(\n--- 记账类型 ---) for i, t in enumerate(TYPES, 1): print(f{i}. {t}) try: type_idx int(input(请选择类型 (1-2): )) - 1 if type_idx not in [0, 1]: raise ValueError type_ TYPES[type_idx] amount float(input(f请输入{type_}金额: )) if amount 0: raise ValueError(金额必须大于0) category input(f请输入分类 (如{CATEGORIES[type_][0]}): ).strip() note input(请输入备注 (可选): ).strip() return type_, amount, category, note except ValueError as e: if could not convert in str(e): print(❌ 错误请输入有效的数字) else: print(f❌ 输入错误{e}请重新输入)3.5 主程序入口 (main.py)项目的“大脑”控制程序的流转。# main.py Python 零基础入门系列终篇综合实战项目 个人记账管理系统主程序 import os from file_utils import load_data, save_data from logic import add_record, delete_record, query_records, get_statistics from ui import show_menu, get_user_choice, input_record # --- 全局变量 --- # 在内存中维护的账单列表 records [] def main(): global records print( 系统启动中...) # 1. 加载数据 records load_data() print(f 已加载 {len(records)} 条历史数据。) # 2. 主循环 while True: show_menu() choice get_user_choice() if choice 1: # 添加记录 print(\n--- 添加新记录 ---) data input_record() if data: type_, amount, category, note data if add_record(records, type_, amount, category, note): print(f✅ 成功记录{type_} {amount}元 ({category})) elif choice 2: # 查看所有 print(\n--- 所有账单 ---) stats get_statistics(records) for r in records: print(f[{r[date]}] ID:{r[id]} {r[type]} {r[amount]:.2f} ({r[category]}) {r[note]}) print(f--- 总计收入 {stats[total_income]:.2f} | 支出 {stats[total_expense]:.2f} | 余额 {stats[balance]:.2f} ---) elif choice 3: # 查询 month input(请输入查询月份 (格式 YYYY-MM, 直接回车查询所有): ).strip() filtered query_records(records, monthmonth if month else None) print(f\n--- 查询结果 ({len(filtered)} 条) ---) for r in filtered: print(f{r[date]} {r[type]} {r[amount]:.2f}元 ({r[category]})) elif choice 4: # 删除 try: rid int(input(请输入要删除的记录ID: )) if delete_record(records, rid): print(✅ 删除成功) else: print(❌ 未找到该ID的记录) except ValueError: print(❌ 请输入有效的ID数字) elif choice 5: # 退出 print( 感谢使用正在保存数据...) save_data(records) print( 再见) break else: print(❌ 无效选择请输入 1-5 之间的数字。) # 暂停按回车继续 input(\n⌨️ 按回车键继续...) if __name__ __main__: main()4. 运行与测试创建项目文件夹新建Personal_Accounting文件夹。创建文件按照上述代码分别创建config.py,file_utils.py,logic.py,ui.py,main.py。安装依赖本项目仅使用标准库无需额外安装。运行cd Personal_Accounting python main.py测试点启动后是否生成了data/accounting.json添加几笔收入和支出退出后数据是否还在输入非数字的金额程序是否会崩溃应该会提示错误并重新输入5. 总结与展望恭喜你你已经完成了 Python 零基础入门系列的全部内容通过这个《个人记账管理系统》你不仅复习了基础语法变量、循环、判断。数据结构字典、列表、JSON。函数与模块代码的封装与复用。异常处理让程序更健壮。文件操作数据的持久化。你现在的身份已经从“Python 学习者”转变为“Python 开发者”下一步建议虽然我们完成了基础版但这个项目还可以继续升级作为你后续的练手项目美化界面使用PrettyTable库让表格更美观。增加图表使用matplotlib画出每月支出饼图。数据校验增加日期格式校验。数据库尝试将 JSON 换成 SQLite 数据库存储。

相关新闻