你是不是也遇到过这些烦恼?
- 每月想记账,但手动输入太麻烦,坚持几天就放弃了
- 微信、支付宝账单一堆,想分析钱花哪儿了,Excel 却看得眼花
- 总是超支,但不知道是哪个类别花超了
为了解决这个问题,我用 Python 写了一个个人财务自动化工具。只需要把微信/支付宝导出的账单放进去,就能自动清洗、分类、生成可视化报表,还能根据预算标出超支项。全程只需几秒钟,每月消费清清楚楚。
后来我又给它加了个网页版,支持多用户登录、在线编辑规则、交互式图表、历史报表管理……现在它已经是一个完整的全栈小项目了。数据全存在本地 MySQL 里,隐私安全有保障。
🛠️ 功能简介
✅ 多平台账单支持
- 微信账单(Excel)自动导入清洗
- 支付宝账单(CSV)自动导入清洗
- 支持同时上传多个文件,自动合并去重
✅ 用户自定义分类
- 通过 JSON 文件配置关键词,自由定义支出类别(如“居住”、“餐饮”)
- 大小写不敏感,支持子串匹配,未匹配的自动归入“其他”
- 支持在线编辑:网页端直接修改规则,即时生效
✅ 自动分类与统计
- 基于规则对每笔支出打标签,输出月度汇总
- 支持多月份数据合并分析
✅ 可视化报表
- 生成包含明细、月度汇总、超支统计的 Excel 报表
- 内嵌饼图(图例含金额)、月度趋势折线图、月度柱状图、超支条形图
✅ 网页端交互式图表
- 使用 ECharts 实现可交互的饼图、趋势图、超支条形图,鼠标悬停显示详情
- 上传后直接在网页上预览,无需下载
✅ 智能超支提醒
- 按月度设置预算(支持默认预算),自动检查超支
- 在 Excel 报表中标红超支单元格
- 输出超支明细 CSV 文件
✅ 多用户与数据隔离
- 注册/登录功能,每个用户只能查看自己的账单数据
- 数据安全存储于 MySQL 数据库
✅ 仪表盘首页
- 展示用户信息、总收支、交易笔数、报表数量
- 当月支出概览与超支状态
- 最近5笔支出记录,快速导航至各功能
✅ 报表历史管理
- 每个用户可查看自己生成的所有报表
- 支持下载和删除报表(物理文件+数据库记录)
✅ 在线预算编辑
- 网页端直接修改月度预算,格式校验,未设置的月份自动使用默认预算
✅ 一键运行
- 命令行版:
python src/main.py完成导入、分类、报表全流程 - Web 版:
python web_app/app.py启动本地服务,浏览器访问
🧰 技术栈
- 后端:Python 3.8+,Flask 框架
- 数据库:MySQL 8.0,SQLAlchemy ORM(含 Flask-SQLAlchemy)
- 数据处理:Pandas,PyArrow(Parquet 格式)
- 可视化:ECharts(前端交互图表),Matplotlib + OpenPyXL(Excel 报表图表)
- 前端:HTML,Jinja2 模板,Bootstrap 5,ECharts JS
- 用户认证:Flask-Login,Flask-Bcrypt
- 表单处理:Flask-WTF,WTForms
- 配置文件:JSON
- 版本控制:Git
模块化设计,代码清晰易扩展,欢迎 Fork 或 PR。
📁 项目结构
personal_finance/
├── config/ # 配置文件
│ ├── budget.json # 月度预算(用户可在线编辑)
│ └── category_rules.json # 分类规则(用户可在线编辑)
├── data/
│ ├── raw/ # 原始账单文件(用户放置)
│ └── processed/ # 清洗后的中间数据(自动生成)
├── src/ # 核心处理模块
│ ├── import_data.py # 导入与清洗(微信/支付宝)
│ ├── classify.py # 基于规则的分类
│ ├── report.py # 报表生成与图表绘制(Excel)
│ ├── alert.py # 超支检查与标记
│ └── main.py # 命令行一键运行入口
├── web_app/ # Web 应用目录
│ ├── app.py # Flask 主程序
│ ├── templates/ # HTML 模板
│ │ ├── base.html # 基础模板(导航栏、闪现消息)
│ │ ├── dashboard.html # 用户仪表盘首页
│ │ ├── index.html # 上传页面
│ │ ├── result.html # 结果页面(交互式图表)
│ │ ├── history.html # 历史查询页面(含超支条形图)
│ │ ├── reports_list.html # 我的报表列表(带删除)
│ │ ├── edit_rules.html # 编辑分类规则
│ │ ├── edit_budget.html # 编辑预算
│ │ ├── login.html # 登录页面
│ │ └── register.html # 注册页面
│ └── static/ # (可选)CSS/JS 文件
├── output/ # 生成的报表、超支记录
├── .gitignore # 忽略临时文件
├── requirements.txt # 依赖包
└── README.md # 本文件
📸 效果展示
网页端页面(Bootstrap 美化)





分析结果页(交互式图表预览)

历史查询页面(带超支条形图)


Excel 报表示例



🚀 快速上手
1. 克隆项目
git clone https://github.com/liguojing112/personal-finance-assistant.git
cd personal-finance-assistant
2. 安装依赖
pip install -r requirements.txt
pip install flask-login flask-bcrypt flask-wtf email-validator # Web 版额外依赖
3. 配置 MySQL
- 安装 MySQL 8.0,启动服务。
- 创建数据库:
CREATE DATABASE finance_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 修改
web_app/app.py中的数据库密码(第 20 行左右)。 - 创建数据表:
from app import app, db with app.app_context(): db.create_all()
4. 自定义分类规则
编辑 config/category_rules.json,或登录 Web 后在“分类规则”页面在线编辑。示例:
{
"居住": ["水电费", "恒星邦办", "康佳滚筒"],
"餐饮": ["便利店", "农夫山泉", "肉夹馍", "水果"],
"购物": ["抖音电商", "拼多多"],
"社交": ["转账", "红包"],
"学习": ["打印", "复印"],
"其他": []
}
5. 配置预算(可选)
编辑 config/budget.json,或登录 Web 后在“编辑预算”页面在线编辑。未设置的月份自动使用默认预算。
{
"2026-01": {
"总预算": 800,
"居住": 200,
"餐饮": 300,
"购物": 150,
"社交": 100,
"学习": 30,
"其他": 50
}
}
6. 运行 Web 应用
cd web_app
python app.py
浏览器访问 http://127.0.0.1:5000,注册账号并登录。
7. 上传账单
从微信/支付宝导出账单,一次性选择多个文件(支持 .xlsx 和 .csv),点击上传。
8. 查看结果
- 网页上立即显示交互式饼图(图例含金额)和月度趋势图(可悬停)。
- 下载 Excel 报表,查看详细汇总和超支标记。
- 在“历史查询”页面按日期筛选,查看各类别累计超支条形图。
- 在“我的报表”页面可下载或删除历史生成的报表。
- 在“分类规则”和“编辑预算”页面随时调整配置。
⚙️ 自定义预算
编辑 config/budget.json,按月份设置预算。未设置的月份会自动使用内置默认预算。
{
"2026-01": {
"总预算": 800,
"居住": 200,
"餐饮": 300,
"购物": 150,
"社交": 100,
"学习": 30,
"其他": 50
}
}
💡 开发经验与心得
写这个项目的过程,就像组装一套乐高,从零开始一块块搭建,中间踩了不少坑,也学到了很多东西。分享几点我觉得对新手有帮助的经验:
1️⃣ 数据处理:永远有你想不到的脏数据
微信和支付宝导出的账单格式不完全一样,甚至同一平台不同时间导出也可能有小差异。一开始我以为用 Pandas 读进来就完事了,结果遇到:
- 支付宝 CSV 编码是 GBK 不是 UTF-8,导致读取报错;
- 备注字段里居然有
NaN,插入 MySQL 时直接崩溃; - 交易单号末尾带着制表符
\t,去重失败。
解决方案:对每个字段做清洗、类型转换、空值处理,最后统一用 Parquet 格式存储中间数据,既快又稳定。所以永远不要相信原始数据,清洗这一步必须做扎实。
2️⃣ 分类规则:从硬编码到用户自定义
一开始我把分类逻辑写在代码里,每次改规则都要改代码、重启服务,太不优雅了。后来改为 JSON 配置文件,用户可自行修改。再后来,干脆做了个在线编辑页面,直接在网页上改 JSON,实时生效。
感悟:把可变的部分配置化,是程序可维护性的第一步。能做成在线配置的,就别让用户改文件。
3️⃣ 图表可视化:静态图片 vs 交互图表
最开始用 Matplotlib 生成静态图片插入 Excel 和网页,虽然能用,但体验一般,鼠标悬停看不了详情,也不够酷。后来换成 ECharts,数据以 JSON 形式传给前端,图表瞬间变得生动,还能缩放、悬停、导出数据。
教训:在数据量不大的个人项目中,前端交互图表带来的体验提升远大于后端生成图片的简单性。现代 Web 开发,选对可视化库能让用户觉得“这很专业”。
4️⃣ 数据库与多用户:设计要提前想
一开始没考虑多用户,所有数据混在一起。后来加用户系统时,才发现要改模型、加外键、迁移数据,折腾了半天。
建议:如果项目将来可能有多用户需求,哪怕现在只有你自己用,也先把 user_id 字段留好,用默认值占位。这样后面扩展时轻松很多。
5️⃣ 关于 Flask 和全栈开发
这是我第一次完整用 Flask 写一个带数据库、用户认证、在线编辑的应用。最大的收获是理解了MVC 模式在实际项目中的样子:模型(Model)放数据,视图(View)用模板渲染,控制器(Controller)写业务逻辑。配合 SQLAlchemy ORM,操作数据库非常优雅。
给新手的建议:不要怕犯错,报错是最好的学习材料。从 ImportError 到 KeyError,再到 MySQL connection failed,每解决一个坑,你对整个系统的理解就深一层。
6️⃣ 一些小坑的快速解决法
-
路径问题:永远用
os.path.abspath(__file__)获取当前文件路径,再往上找根目录,避免在命令行不同目录运行时报错。 -
编码问题:支付宝 CSV 是 GBK,微信 Excel 是 UTF-8,统一用
encoding='utf-8-sig'输出,至少保证 Excel 打开不乱码。 -
调试技巧:遇到 Flask 报错不要慌,看终端里的完整 traceback,一般都能找到是哪行代码出问题。实在不行,加
print()大法,虽然原始,但有效。
总的来说,这个小项目让我把 Python 后端、数据库、前端、数据分析都串了一遍,收获巨大。如果你也想做一个类似的工具,建议从最简单的版本开始,一点点加功能,每次只解决一个问题。过程中你会发现,原来自己也可以做出一个“能用”且“好看”的东西。
📌 项目地址
GitHub: https://github.com/liguojing112/personal-finance-assistant
欢迎 Star、Fork、提 Issue 或 PR!
💡 后续计划
- [ ] 增加机器学习辅助分类(当规则未覆盖时)
- [ ] 支持多账单合并(如多个微信账号)
- [ ] 增加年报表与同比分析
- [ ] 部署到云服务器,支持在线使用
- [ ] 添加数据导出功能(CSV/PDF)
🤝 欢迎交流
如果你也有类似的需求或想法,欢迎在评论区留言,或到 GitHub 上找我。我们一起让生活更美好~
Happy budgeting! 🧾
最后修改于


8


支持下,希望能火
谢谢
谢谢
开源了嘛
由于每个人的消费情况不同且复杂,我打算将分类规则外置为配置文件,优化完就可以用了。