1 简介
- 最近想整理一下账单,发现微信每次只能导出3个月的账单。。。支付宝导出的时间更长一点。
- 为了把这些账单整合,我写了一个python的程序。
- 使用本程序之前,不要修改导出的账单的文件名!
- 码云
- 我把程序打包好了,可以在码云的dist文件夹下找到
2 思路
- 第一步:选择账单文件(官方导出的csv文件),程序会循环调用文件对话框,每次只能选择一个文件,直到没有选择文件为止。
- 第二步:如果第一步中有选择文件,则弹出保存文件对话框,选择保存的位置。如果没有,则程序直接结束
- 第三步:处理每一个csv文件,一行一行地读取,将数据行按照逗号分隔开,然后取自己需要的内容即可。
- 第四步:在windows系统下,写一个bat批处理文件,方便运行python文件。
py文件内容如下
import os
import win32ui
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])
def getCsvFilenames():
filenames = []
lpszFilter = "csv Files (*.csv,*.txt)|*.csv;*.txt|" \
"Files (*.*)|*.*|| "
global choosePath
while True:
dlg = win32ui.CreateFileDialog(True, "csv", None, 0x04 | 0x02, lpszFilter)
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)
print("处理完毕")
os.system("pause")
python 微信_支付宝支付记录整合.py
pause