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:将银行扣费信息整理成账单

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