Python:将银行扣费信息整理成账单

作者: 一名普通用户 | 来源:发表于2017-08-22 11:35 被阅读0次

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

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

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') #保存文件
......
还能自定义字体等

参考信息:xlwt 1.2.0 : Python Package Index
6.2. re — Regular expression operations — Python 3.6.2 documentation

最终代码如下

#!/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')
   

欢迎留言共同改进程序~

来自个人 Python 文集

相关文章

  • Python:将银行扣费信息整理成账单

    全文以工商银行的扣费信息为例 工行储蓄卡,绑定支付宝、微信后日常使用,偶尔会转入,日常收到的通知短信有支付、转入、...

  • 做梦都梦见老公说我又要钱

    昨天才让老公还了美团账单的100多。 今天电费账单又来了,一直都是银行卡自动划扣的,因为余额不够,才收到信息,还要...

  • 2.12账单

    今日账单9.8+9.92+5.19+220=245元。 今日账单扣费:6*3.2+3*5.6=36元 康交卡今日打...

  • 心理安慰?

    一直觉得手机里有好多按月扣费软件,但是基本上除了个别工作软件外基本上都不怎么用。 查完扣费账单,才发现居然有的我都...

  • 信用卡账单简析

    【信用卡账单调研】 本次信用卡账单调研范围为招商银行、广发银行、中信银行、交通银行,所有账单均为邮箱账单。 上表为...

  • 短信

    扣费,短扣 转储蓄短信 点击忘记密码,没有发送短信,转手机银行客户端 VIP免费短信转储蓄短信

  • 微辰金服:0账单是什么意思?对信用卡有什么影响?

    有人说,0账单是什么意思,0账单,就是赶在银行本期账单日出来之前,将所有的信用卡欠款全部还了,等到实际出账单日那天...

  • 很多人反映 苹果手机和云上贵州自动扣费

    今天翻支付宝账单偶然发现了一个21元的不明扣费,是通过我的苹果账户扣的,原因是我扩大了我的icloud的容量,然而...

  • 失而复得的一笔钱

    Google Play Store绑定Master银行卡,不小心下载了一个付费应用。下好之后没过几天收到银行卡扣费...

  • 收到"回复TD退订"的短信,到底要不要回?

    自从有了微信 手机短信几乎就不用了 除了看看每月的银行扣费提醒 绝大部分收到的都是些广告信息 所以每隔一段时间 小...

网友评论

    本文标题:Python:将银行扣费信息整理成账单

    本文链接:https://www.haomeiwen.com/subject/gflfdxtx.html