某银行销户数据处理难点解决

需求

需要每天获取 txt 格式的销户数据,解析并按网点号生成 excel 表格。
销户数据内容如下:

网点号  账户  销户日期
0**06  750********253334  2019-07-16
0**15  751********105418  2019-07-16
0**05  750********119448  2019-07-16
0**06  750********253334  2019-07-16
0**15  751********105418  2019-07-16
0**05  750********119448  2019-07-16
0**06  750********253334  2019-07-16
0**15  751********105418  2019-07-16
0**05  750********119448  2019-07-16



末尾可能有数量不一定的几个空行。对于相同网点号的数据,都填到同一个以网点号命名的 excel 表中。

思路

依次读取每一行,将网点号作为 defaultdict 字典的键,账户及销户日期作为一个列表并插入对应键的值中;然后遍历这个字典,将每个键下的每组列表都连同这个键一起存放在一个列表中,最终实现的效果如下:

[[['750********253334', '2019-07-16', '0**06'],
  ['750********253334', '2019-07-16', '0**06'],
  ['750********253334', '2019-07-16', '0**06']],
 [['751********105418', '2019-07-16', '0**15'],
  ['751********105418', '2019-07-16', '0**15'],
  ['751********105418', '2019-07-16', '0**15']],
 [['750********119448', '2019-07-16', '0**05'],
  ['750********119448', '2019-07-16', '0**05'],
  ['750********119448', '2019-07-16', '0**05']]]

算法

完整代码清单:

import fileinput
from collections import defaultdict
import itertools
import pprint

def parse_txt(path):
    # 初始化一个值为列表类型的defauldict
    dic = defaultdict(list)
    # 使用fileinput进行文件行的高效率迭代
    for line in fileinput.input(path):
        try:
            li = line.split()
            # 不加if判断直接进行插值操作,进一步缩短运行时间
            # 这种情况下会对第一行的中文也进行处理,后面需要剔除
            dic[li[0]].append([li[1], li[2]])
        # 碰到空行时li的结果为空列表,捕获到索引错误的异常时就退出for循环
        except IndexError:
            break
    # 剔除操作
    del dic['网点号']
    # 以键值对形式返回字典
    return dic.items()

def change_defaultdict(items):
    need_li = []
    for item in items:
        # 一行超人
        need_li.append([list(itertools.chain(item[1][i], [item[0]])) for i in range(len(item[1]))])
        # 这样写也行:need_li.append([item[1][i]+[item[0]] for i in range(len(item[1]))])
    return need_li


if  __name__  ==  "__main__":
    # 使用pprint进行格式化打印
    pprint.pprint(change_defaultdict(parse_txt('0716销户清单.txt')))