实现初衷
- 每天通过手动记账太麻烦,而且要精细到每一项支付的内容,每天坚持记账不仅考验恒心还得考验耐心
- 随手记app有自带的支付宝账单导入功能,但是貌似数据不全,好像也不支持微信
- 以下的实现只统计了支出的数据,因为我收入只有工资,直接手打一项就好了
下载账单流水
微信账单
- 打开手机微信app,找到"我"->“服务”->“钱包”->“账单”->“常见问题”->“下载账单”->“用于个人对账”
支付宝账单
- 打开手机支付宝app,找到"我的"->“账单”->右上角"***"->“开具交易流水证明”->“用于个人对账”
处理数据
账单文件命名及存放
上步操作完从邮箱可以拿到对应的微信和支付宝账单
其中账单是csv格式,需要放在python脚本的同级目录下,同时我们需要手动重命名一下
执行Python脚本
双击run.bat执行脚本
执行成功后,生成两份文件
随手记导入数据
- 打开随手记网页版 https://login.sui.com/login.jsp?
查看账单
也可以在手机端随手端app查看,我这是在网页版查看,同理支付宝操作跟微信一样,再导入支付宝数据就可以看了
代码实现
微信的脚本
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# author: rzhao
import csv
import xlrd
from xlutils.copy import copy
head_content = ['交易时间', '交易类型', '交易对方', '商品', '收/支', '金额(元)', '支付方式', '当前状态', '交易单号', '商户单号', '备注']
def wei_xin_sort(s):
sort_list = {"购物": ["淘宝", "美团", "拼多多", "京东", "唯品会"],
"出行": ["滴滴出行", "加油站", "广东联合电子服务股份有限公司", "停车缴费"],
"医疗": ["医院", "药品"]}
for (a, b) in sort_list.items():
for i in b:
if i in s[head_content.index("商品")]:
return a, i
return "其他", s[head_content.index("商品")]
# 打开随手记模板文件
read_book = xlrd.open_workbook(r"./template.xls", formatting_info=False)
# 根据sheet索引或者名称获取sheet内容
r_wei_xin_sheet = read_book.sheet_by_index(0)
head = r_wei_xin_sheet.row_values(0) # 获取第一行的表头内容
print(head)
index = head.index('交易类型') # 获取交易类型列所在的列数
# 拷贝一份用于写
write_wei_xin_book = copy(read_book)
wei_xin_sheet = write_wei_xin_book.get_sheet(0)
# 打开微信的账单文件
csv_file = csv.reader(open('./wechat.csv', encoding='UTF-8'))
count = 0
print(head_content.index("收/支"))
r = 1 # 行数
for line in csv_file: # 数据类型是列表
if count >= 17 and "支出" in line[head_content.index("收/支")]:
# print(line)
wei_xin_sheet.write(r, head.index("交易类型"), "支出")
wei_xin_sheet.write(r, head.index("日期"), line[head_content.index("交易时间")])
wei_xin_sheet.write(r, head.index("金额"), line[head_content.index("金额(元)")][1:])
sort_main_sub = wei_xin_sort(line)
print(sort_main_sub)
wei_xin_sheet.write(r, head.index("分类"), sort_main_sub[0])
wei_xin_sheet.write(r, head.index("子分类"), sort_main_sub[1])
wei_xin_sheet.write(r, head.index("商家"), line[head_content.index("交易对方")])
wei_xin_sheet.write(r, head.index("项目"), line[head_content.index("商品")])
wei_xin_sheet.write(r, head.index("账户1"), "微信")
r += 1
count += 1
write_wei_xin_book.save("./wei_xin.xls")
支付宝的脚本
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# author: rzhao
import codecs
import csv
import xlrd
from xlutils.copy import copy
def zhi_fu_sort(s):
sort_list = {"购物": ["淘宝", "美团", "拼多多", "京东", "唯品会"],
"出行": ["滴滴出行", "加油站", "广东联合电子服务股份有限公司", "停车缴费"],
"医疗": ["医院", "药品"]}
if "淘宝" in s[4]:
return "购物", "淘宝"
else:
for (a, b) in sort_list.items():
for i in b:
if i in s[6]:
return a, i
return "其他", s[6]
# 打开随手记模板文件
read_book = xlrd.open_workbook(r"./template.xls", formatting_info=False)
# 根据sheet索引或者名称获取sheet内容
r_zhi_chu_sheet = read_book.sheet_by_index(0)
head = r_zhi_chu_sheet.row_values(0) # 获取第一行的表头内容
print(head)
index = head.index('交易类型') # 获取交易类型列所在的列数
# 拷贝一份用于写
write_zhi_fu_bao_book = copy(read_book)
zhi_chu_sheet = write_zhi_fu_bao_book.get_sheet(0)
# 打开支付宝的账单文件
with codecs.open('./alipay.csv') as f:
r = 1 # 行数
for row in csv.DictReader(f, skipinitialspace=True):
for (k, v) in row.items():
# 原始row中有很多空格,给去除一下
new_row = [x.strip() for x in v if x.strip() != '']
if k is None:
if len(v) == 16 and "支出" in new_row[9]:
# print(new_row)
zhi_chu_sheet.write(r, head.index("交易类型"), "支出")
zhi_chu_sheet.write(r, head.index("日期"), new_row[1])
zhi_chu_sheet.write(r, head.index("金额"), new_row[8])
sort_main_sub = zhi_fu_sort(new_row)
print(sort_main_sub)
zhi_chu_sheet.write(r, head.index("分类"), sort_main_sub[0])
zhi_chu_sheet.write(r, head.index("子分类"), sort_main_sub[1])
zhi_chu_sheet.write(r, head.index("商家"), new_row[6])
zhi_chu_sheet.write(r, head.index("项目"), new_row[7])
zhi_chu_sheet.write(r, head.index("账户1"), "支付宝")
r += 1
write_zhi_fu_bao_book.save("./zhi_fu_bao.xls")