可用纯python实现记账工具:用csv存数据(date,type,amount,note四列)、input()交互,日期用dateutil解析并标准化为date对象,全量读入内存计算,导出用pandas.to_excel。

能用纯 Python 实现,但别直接从零写数据库和 GUI——先用 csv 存数据、input() 做交互,两周内就能跑起来一个可查、可增、可导出的记账工具。
用 csv 而不是 json 或手写文件格式存账目
csv 文件天然适配财务场景:每行一条记录,列名清晰(日期、类型、金额、备注),Excel 可直接打开,也方便后续用 pandas 分析。用 json 会多一层嵌套结构,反而增加读写逻辑;手写格式(如空格分隔)一旦备注里含空格或逗号就容易解析错。
- 固定列顺序:
date,type,amount,note,首行必须是这四个字段 - 写入时用
csv.writer,别用字符串拼接——自动处理引号和转义 - 读取时用
csv.DictReader,按字段名取值,避免靠索引硬编码 - 金额统一存为字符串或浮点数均可,但推荐字符串(如
"-128.50"),避免浮点精度误差影响求和
用 datetime.date.fromisoformat() 校验并标准化日期输入
用户随手输 "2024-5-1"、"1/5/2024"、"昨天" 都很常见,但后续按月汇总、排序都依赖规范日期。Python 自带的 fromisoformat() 只认 "YYYY-MM-DD",所以得先做转换。
- 接受用户输入后,优先尝试
datetime.date.fromisoformat(input_str) - 失败则用
dateutil.parser.parse(input_str).date()(需装python-dateutil) - 仍失败就提示重新输入,不强行猜测——比如
"5/1"在不同地区含义不同 - 所有内部存储和比较都用
date对象,显示时再用.strftime("%Y-%m-%d")
避免在循环里反复打开/关闭 csv 文件
每次记一笔就 open(..., "a") 写一行没问题,但做“本月支出汇总”时如果对每条记录都 open→读→关,IO 开销会明显拖慢响应,尤其账目超 500 条后。
- 把全部账目一次性读进内存(
list[dict]),再用filter()和sum()计算——普通笔记本处理万条记录也只要几十毫秒 - 写操作保持单次追加(
"a"模式),读操作保持单次全量加载 - 不要为了“节省内存”而边读边算——财务数据量级下,内存不是瓶颈,代码可读性和维护成本才是
- 如果真要支持超大文件(>10 万行),再考虑
itertools.islice分块或换sqlite3
导出 Excel 时别直接调用 openpyxl 从头建表
多数人导出只是为了发给家人看或临时贴到微信,根本不需要合并单元格、图表、密码保护。用 openpyxl 写 10 行代码不如用 pandas.DataFrame.to_excel() 一行解决,还自动处理日期格式和数字对齐。
- 确保已安装
pandas和openpyxl(to_excel的后端) - 读取
csv后转成DataFrame,调用.to_excel("report.xlsx", index=False) - 如果报错
ModuleNotFoundError: No module named 'openpyxl',就pip install openpyxl,不是xlsxwriter - 导出前可加一列
"month"(df["date"].dt.to_period("M")),方便后续 Excel 里透视分析
真正卡住进度的往往不是“怎么实现分类统计”,而是“用户输错日期格式没提示”“导出的 Excel 打不开说文件损坏”“备注里有换行符导致 csv 错位”。把这三类边界情况用最小代价兜住,系统就稳了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











