支付宝和微信的支付记录整合

1 简介

  • 最近想整理一下账单,发现微信每次只能导出3个月的账单。。。支付宝导出的时间更长一点。
  • 为了把这些账单整合,我写了一个python的程序。
  • 使用本程序之前,不要修改导出的账单的文件名!
  • 码云
    • 我把程序打包好了,可以在码云的dist文件夹下找到

2 思路

  • 第一步:选择账单文件(官方导出的csv文件),程序会循环调用文件对话框,每次只能选择一个文件,直到没有选择文件为止。
  • 第二步:如果第一步中有选择文件,则弹出保存文件对话框,选择保存的位置。如果没有,则程序直接结束
  • 第三步:处理每一个csv文件,一行一行地读取,将数据行按照逗号分隔开,然后取自己需要的内容即可。
  • 第四步:在windows系统下,写一个bat批处理文件,方便运行python文件。
    py文件内容如下
import os
import win32ui  # 需要单独安装:pip install pypiwin32
import sys
from pathlib import Path

'''
导出的标题包括:
["交易时间", "商品名称", "交易金额","收/支" ,"交易对方","交易类型", "备注"]
'''
# 文件标识
weChatFileSign = "微信"
aliPayFileSign = "alipay"
# 文件的字符集
weChatFileCharset = "UTF-8"
aliPayFileCharset = "GBK"
# 标题的位置
weChatTitleRow = 17
aliPayTitleRow = 5
# 标题的映射关系
titles = ["交易时间", "商品名称", "交易金额", "收/支", "交易对方", "交易类型", "备注", "来源"]
weChatTitleRelation = [0, 3, 5, 4, 2, 1, 10]
aliPayTitleRelation = [2, 8, 9, 10, 7, 6, 14]
weChatTitleLen = 11
aliPayTitleLen = 16
titleLen = len(titles)
# 支付宝交易状态的列
aliPayStatusCol = 11
aliPayStatusFaild = "交易失败"  # 交易失败的字样,不要该行

# 文件选择的位置
choosePath = os.path.dirname(sys.argv[0])

# 返回选择的多个csv文件
def getCsvFilenames():
    filenames = []
    lpszFilter = "csv Files (*.csv,*.txt)|*.csv;*.txt|" \
                 "Files (*.*)|*.*|| "
    global choosePath
    while True:
        # 当前文件夹路径
        dlg = win32ui.CreateFileDialog(True, "csv", None, 0x04 | 0x02, lpszFilter)  # 1表示打开文件对话框
        # 设置打开文件对话框中的初始显示目录
        dlg.SetOFNInitialDir(choosePath)
        dlg.DoModal()
        # 等待获取用户选择的文件
        filename = dlg.GetPathName()  # 获取选择的文件名称
        if filename == "":
            break
        print(filename)
        filenames.append(filename)
        choosePath = os.path.dirname(filename)
    return filenames


# 获取保存的位置
def getSaveFilepath():
    dlg = win32ui.CreateFileDialog(False, "csv", None, 0x04 | 0x02, "csv Files (*.csv)|*.csv||")
    # 设置打开文件对话框中的初始显示目录
    dlg.SetOFNInitialDir(choosePath)
    dlg.DoModal()
    # 等待获取用户选择的文件
    return dlg.GetPathName()  # 获取选择的文件名称


# 处理微信付款记录
def resolveWeChat(filename, saveFile):
    out = open(saveFile, "a", encoding="GBK", errors='ignore')
    # 写入文件
    curLine = 0
    with open(filename, 'r', encoding=weChatFileCharset, errors="ignore") as r:
        for line in r.readlines():
            curLine = curLine + 1
            if curLine < (weChatTitleRow + 1):
                continue
            else:
                # 其他行
                cols = line.split(",")
                if len(cols) < weChatTitleLen:
                    continue
                writeLineArr = []
                for i in range(titleLen - 1):
                    index = weChatTitleRelation[i]
                    writeLineArr.append(cols[index].strip())
                writeLineArr.append("微信支付\n")
                writeLine = ",".join(writeLineArr)
                out.writelines(writeLine)
    out.close()


# 处理支付宝付款记录
def resolveAliPay(filename, saveFile):
    out = open(saveFile, "a", encoding="GBK", errors='ignore')
    # 写入文件
    curLine = 0
    with open(filename, 'r', encoding=aliPayFileCharset) as r:
        for line in r.readlines():
            curLine = curLine + 1
            # 处理每一行
            if curLine < (aliPayTitleRow + 1):
                continue
            else:
                # 其他行
                cols = line.split(",")
                if len(cols) < aliPayTitleLen:
                    continue
                writeLineArr = []
                if cols[aliPayStatusCol] == aliPayStatusFaild:
                    # 抛去交易失败的
                    continue
                for i in range(titleLen - 1):
                    index = aliPayTitleRelation[i]
                    writeLineArr.append(cols[index].strip())
                writeLineArr.append("支付宝支付\n")
                writeLine = ",".join(writeLineArr)
                out.writelines(writeLine)
    out.close()


# 处理文件
def resolveFile(filenamePath, saveFile):
    filename = os.path.basename(filenamePath)
    flag = filename.find(weChatFileSign)
    print("正在处理>>" + filename)
    if flag >= 0:
        resolveWeChat(filenamePath, saveFile)
        return
    flag = filename.find(aliPayFileSign)
    if flag >= 0:
        resolveAliPay(filenamePath, saveFile)
    else:
        print("文件格式不正确!")


filenames = getCsvFilenames()
if len(filenames) > 0:
    print("开始处理文件")
    saveFilePath = getSaveFilepath()
    if saveFilePath != "":
        # 看看文件是否存在
        saveFileTemp = Path(saveFilePath)
        if not saveFileTemp.exists():
            # 如果文件不存在则创建,并添加标题行
            save = open(saveFilePath, "a", encoding="GBK", errors='ignore')
            temp = ",".join(titles) + "\n"
            save.writelines(temp)
            save.close()
        for filenamePath in filenames:
            fileTemp = Path(filenamePath)
            if fileTemp.exists():
                resolveFile(filenamePath, saveFilePath)
# 如果没选择文件则filenamePath是空的
print("处理完毕")
os.system("pause")
  • 批处理文件内容如下
python 微信_支付宝支付记录整合.py
pause
  • 将批处理文件的快捷方式放到桌面即可方便调用。
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值