Python流水分类脚本,编写代码识别微信/支付宝收支关键词,自动归类餐饮/交通/购物账目,一键生成CSV记账表,适配个人日常随手记账,高别手动分类。
利用关键词匹配算法,将杂乱无章的支付备注转化为结构化的财务报表,彻底告别手动打钩分类的痛苦。
以下是完整的项目交付文档:
项目名称:SmartLedger-NLP (智能流水分类脚本)
一、 实际应用场景描述
场景: 月底了,你的微信和支付宝账单加起来有200多笔。
现状: 你看着满屏的“商户单号”、“二维码收款”、“扫一扫付款”,完全想不起来上周三下午那笔28.5元到底买了什么。
操作流程:
1. 从微信/支付宝导出CSV账单(通常备注栏是混乱的)。
2. 运行本脚本,指定文件路径。
3. 程序自动扫描“交易备注”和“交易对方”字段。
4. 输出一份新的
"classified_ledger.csv",其中新增了“消费类别”列(餐饮/交通/购物/娱乐...)。
5. 直接导入Excel进行透视分析。
二、 引入痛点 (Pain Points)
传统记账方式存在以下痛点:
1. 语义模糊: “肯德基宅急送” ≠ “餐饮”,机器看不懂。
2. 重复性劳动: 每个月都要手动把相似的商家拖到同一个分类里。
3. 规则滞后: 遇到新出现的APP(如“朴朴超市”),旧规则无法识别。
4. 非技术门槛: 普通人不会写Excel宏,只能肉眼分类。
本方案的解决思路:
利用 “关键词正则匹配 + 优先级权重” 算法。建立一个“财务词典”,让Python像老会计一样,看到“美团”、“饿了么”就知道是“餐饮”,看到“滴滴”、“地铁”就知道是“交通”。
三、 核心逻辑讲解 (Algorithm Logic)
我们采用 “字典树 (Trie) 简化版 —— 哈希表匹配” 算法:
1. 规则库构建 (Rule Base):
- 创建一个字典,键是分类(Category),值是关键词列表。
- 例:
"{"餐饮": ["麦当劳", "肯德基", "美团", "饿了么", "星巴克"]}"。
2. 逐行扫描 (Row Scanning):
- 读取CSV的每一行,提取
"description" 字段。
3. 优先级匹配 (Priority Matching):
- 为了避免歧义(比如“苹果”可能是水果也可能是手机),我们设定最长匹配优先或优先级从高到低。
- 如果备注中包含“医院”,直接归类为“医疗”,不再往下判断。
4. 兜底策略 (Default Category):
- 如果所有关键词都不匹配,归类为“其他”,方便人工二次审核。
四、 代码模块化实现 (Core Code)
以下是核心程序
"smart_ledger.py"。
技术栈: Python 3.x + pandas (数据处理) + re (正则表达式)。
"""
smart_ledger.py
功能:微信/支付宝CSV流水智能分类脚本
日期:2026-04-13
"""
import pandas as pd
import re
from collections import defaultdict
# =========================
# 模块一:会计科目规则库 (可配置)
# =========================
ACCOUNTING_RULES = {
"餐饮": [
"肯德基", "麦当劳", "星巴克", "瑞幸", "美团", "饿了么",
"必胜客", "汉堡王", "喜茶", "奈雪", "海底捞"
],
"交通": [
"滴滴", "高德", "地铁", "公交", "一卡通", "加油",
"停车", "高铁", "飞机", "打车"
],
"购物": [
"淘宝", "京东", "拼多多", "唯品会", "盒马", "山姆",
"便利店", "超市", "屈臣氏"
],
"娱乐": [
"电影", "影院", "KTV", "游戏", "Steam", "Netflix"
],
"医疗": [
"医院", "药房", "药店", "挂号"
],
"转账": [
"转账", "红包", "还款"
]
}
# =========================
# 模块二:NLP分类引擎
# =========================
class TransactionClassifier:
"""
交易流水分类器
"""
def __init__(self, rules):
self.rules = rules
# 预编译正则表达式以提高性能
self.compiled_rules = self._compile_rules()
def _compile_rules(self):
"""将关键词列表编译为正则表达式"""
compiled = defaultdict(list)
for category, keywords in self.rules.items():
for kw in keywords:
# 使用 re.escape 防止特殊字符干扰
compiled[category].append(re.compile(re.escape(kw)))
return compiled
def classify(self, description: str) -> str:
"""
对单条交易描述进行分类
参数:
description: 交易备注或商户名称字符串
返回:
分类名称 (str)
"""
if not isinstance(description, str):
return "其他"
# 按优先级遍历规则库
for category, patterns in self.compiled_rules.items():
for pattern in patterns:
if pattern.search(description):
return category
# 如果没有匹配到任何规则
return "其他"
# =========================
# 模块三:数据处理管道
# =========================
class LedgerProcessor:
"""
账本处理器
"""
def __init__(self, classifier: TransactionClassifier):
self.classifier = classifier
def process_csv(self, input_file: str, output_file: str):
"""
读取CSV,添加分类列,并输出新CSV
"""
try:
# 微信/支付宝导出的CSV编码通常是GBK或UTF-8
df = pd.read_csv(input_file, encoding='gbk')
except UnicodeDecodeError:
df = pd.read_csv(input_file, encoding='utf-8')
# 智能识别列名 (微信和支付宝的列名略有不同)
desc_column = None
amount_column = None
for col in df.columns:
if "备注" in col or "商品" in col or "描述" in col:
desc_column = col
if "金额" in col or "收/支" in col: # 支付宝可能是收/支
amount_column = col
if not desc_column:
raise ValueError("未找到交易描述列,请检查CSV格式")
# 应用分类算法
print(f"开始处理 {len(df)} 条记录...")
df['智能分类'] = df[desc_column].apply(self.classifier.classify)
# 保存结果
df.to_csv(output_file, index=False, encoding='utf-8-sig')
print(f"✅ 处理完成!已保存至: {output_file}")
# 打印统计摘要
self._print_summary(df)
def _print_summary(self, df):
"""打印分类统计摘要"""
print("\n📊 消费类别统计:")
summary = df.groupby('智能分类')['智能分类'].count().sort_values(ascending=False)
print(summary)
# =========================
# 模块四:主程序入口
# =========================
def main():
# 1. 初始化分类器
classifier = TransactionClassifier(ACCOUNTING_RULES)
# 2. 初始化处理器
processor = LedgerProcessor(classifier)
# 3. 定义文件路径
input_csv = "wechat_alipay_export.csv" # 用户需将此文件放入同目录
output_csv = "classified_ledger.csv"
# 4. 执行处理
try:
processor.process_csv(input_csv, output_csv)
except FileNotFoundError:
print(f"❌ 错误: 找不到输入文件 '{input_csv}'")
print("请先将微信/支付宝导出的账单重命名为此文件名。")
except Exception as e:
print(f"❌ 发生未知错误: {e}")
if __name__ == "__main__":
main()
五、 README.md 文件
# 📊 SmartLedger-NLP
> 告别手动记账:微信/支付宝流水智能分类脚本
## 🌟 项目简介
这是一个基于Python的命令行工具,利用关键词匹配算法自动识别微信/支付宝导出的CSV账单,将其归类为餐饮、交通、购物等科目,一键生成结构化报表。
## 🛠️ 环境依赖
- Python 3.8+
- pandas (pip install pandas)
## 🚀 快速开始
1. 从微信/支付宝导出账单,保存为 `wechat_alipay_export.csv`。
2. 将文件放在脚本同目录下。
3. 运行程序:
bash
python smart_ledger.py
4. 查看生成的 `classified_ledger.csv`。
## ⚙️ 自定义规则
打开 `smart_ledger.py`,修改 `ACCOUNTING_RULES` 字典:
python
ACCOUNTING_RULES = {
"我的专属分类": ["特定商家A", "特定APP_B"],
# ... 添加更多规则
}
六、 使用说明 (User Guide)
Step 1: 导出账单
- 微信: 我 → 服务 → 钱包 → 账单 → 常见问题 → 下载账单 → 用于个人对账。
- 支付宝: 我的 → 账单 → 右上角齿轮 → 开具交易流水证明 → 申请。
Step 2: 准备环境
- 确保电脑安装了Python 3.8+。
- 安装pandas:
"pip install pandas"。
Step 3: 运行与检查
- 将导出的CSV文件重命名为
"wechat_alipay_export.csv"。
- 运行脚本。
- 打开输出的
"classified_ledger.csv",检查“智能分类”列。如果有错漏,按“使用说明”修改规则库。
七、 核心知识点卡片 (Flash Cards)
卡片主题 编程/算法概念 会计/财务关联
规则引擎 字典 (Dict) 数据结构 会计科目表的数字化映射
正则表达式
"re.compile()",
"search()" 模糊匹配商户名称,如“XX路麦当劳”
Pandas DataFrame 表格数据处理 电子账本的自动化处理
异常处理
"try...except" 应对脏数据、编码错误的鲁棒性
CSV编码 GBK vs UTF-8 解决Windows环境下中文乱码的关键
八、 总结
作为一名全栈工程师,我深知“数据如果不经过清洗,就是垃圾;经过算法处理,才是资产”。
这个记账脚本虽然只有几百行代码,但它体现了财务智能化的雏形:
1. 规则即逻辑: 把老会计的经验(看到什么字归哪类)变成了代码里的字典。
2. 解放双手: 将重复性劳动交给CPU,人类只负责制定规则和审核结果。
3. 数据可视化前置: 只有分类清晰的数据,才能画出漂亮的消费趋势图。
让每一分钱,都在代码的注视下各归其位。💰📈
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!
更多推荐



所有评论(0)