python计算银行余额_Python:将银行扣费信息整理成账单

全文以工商银行的扣费信息为例

工行储蓄卡,绑定支付宝、微信后日常使用,偶尔会转入,日常收到的通知短信有支付、转入、信使展期扣费三类:

1. 您尾号1234卡1月2日20:57POS支出(快捷支付)100元,余额664.88元。【工商银行】

2. 您尾号7256卡2月3日15:35ATM收入(现存)8,000元,余额8,664.88元。【工商银行】

3. 您尾号1234卡4日02:55工商银行支出(信使展期)2元,余额8,662.88元。【工商银行】

最后的整理结果如图

screenshot.png

需要从每条短信中提取出来的信息有:日期、金额、方式、余额

第一、二类短信具有相同的格式,可以用同一个正则表达式提取信息,第三类缺少了一个日期,需要另写一个(存储的时候月份用00 代替)。

第一个正则表达式为:您尾号(\d{4})卡(\d{1,2})月(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元,余额([\d.,]+)元。【工商银行】

第二个正则表达式为:您尾号(\d{4})卡(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元,余额([\d.,]+)元。【工商银行】 ,区别在于少了月份。

留意扣费方式的匹配用了非贪婪模式 ?

读 xls 要用到 xlrd ,而本次是要写入 xls ,所以用的是 xlwt 模块

file = xlwt.Workbook() #新建文件,留意大小写

table = file.add_sheet('name') #新建一个sheet

table.write(行,列,值) #写入数据

table = file.add_sheet('sheet name',cell_overwrite_ok=True) #需要对同一个单元格重复写入覆盖数据

file.save('demo.xls') #保存文件

......

还能自定义字体等

最终代码如下

#!/usr/bin/python3

# -*- coding:utf-8 -*-

import re,xlwt

common = re.compile(u'您尾号(\d{4})卡(\d{1,2})月(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元,余额([\d.,]+)元。【工商银行】')

notify_fee = re.compile(u'您尾号(\d{4})卡(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元,余额([\d.,]+)元。【工商银行】')

xls = xlwt.Workbook()

table = xls.add_sheet(u'账单')

table.write(0,3,'方式')

table.write(0,4,'用途')

table.write(0,5,'余额')

table.write(0,6,'备注')

def f(month,day,reason,fee,remain,line):

while(len(month) < 2):

month = '0' + month

while(len(day) < 2):

day = '0' + day

if '.' in fee:

fee = float(fee.replace(',',''))

else:

fee = int(fee.replace(',',''))

if '出' in reason:

fee = -fee

remain = float(remain.replace(',',''))

remain = round(remain,2)

table.write(line,1,month+day)

table.write(line,2,fee)

table.write(line,3,reason)

table.write(line,5,remain)

if __name__ == '__main__':

with open('bank.txt','r') as file:

current = 1

for line in file.readlines():

line = line.strip()

r1 = common.match(line)

r2 = notify_fee.match(line)

if r1:

f(r1.group(2),r1.group(3),r1.group(5),r1.group(6),r1.group(7),current)

current = current + 1

elif r2:

f('',r2.group(2),r2.group(4),r2.group(5),r2.group(6),current)

current = current + 1

else:

print('other #' + line.strip())

xls.save('result.xls')

欢迎留言共同改进程序~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值