当前位置: 首页 > 后端技术 > Python

自动化记账程序1.0

时间:2023-03-26 16:25:42 Python

需求背景:为了更好的解放双手,提高记账效率,想做一个基于python的自动记账程序,用来统计我的周利润,月利润,年利润,甚至日利润和丢失记录,程序目前处于半自动化状态,未来会逐步更新,力求整个过程纯自动化,不需要过多的人工参与,摆脱人工处理的耗时工作会计和统计。需求总目标:日常账目:连接常用的支付通讯软件,将你花费的每一笔费用自动归类到一个暂存位置,然后可以将这个暂存位置以excel格式记录保存,并下载到指定电脑桌面位置。每周账目:统计一周的支出和收入,并以图表的形式展示各项支出和收入。月账:统计一个月(即四个星期)的支出和收入,并以图表的形式展示各项支出和收入。年度账目:对一年(即12个月)的费用和收入进行统计,并以图表的形式展示各类费用和收入。本记账程序1.0的目标:从2021年5月23日到2021年5月29日)可以得到当周的收入和收入统计,总收入,总支出,盈余【注:本次编译不会过多介绍很多理论性的东西,纯小白实战教程】具体内容:准备工作本次以python会计程序的实现为主。前提是部署好python编译环境。这里我使用anaconda中的jupyternotebook作为编译器。如果不知道怎么安装,传送门:Anaconda下载【清华镜报】:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda安装教程:https://www.cnblogs.com/sui776265233/p/11453004.html如果是第一次安装anaconda,设置好编译环境后,需要打开cmd窗口开始下载第三方库【如何打开cmd窗口,使用快捷键win+r,输入cmd],cmd窗口效果如下图。因为这次需要用到的库有xlrd库、xlwt库、pyinstaller库和calendar库,在下载xlrd库的弹窗黑框输入命令:继续下载xlwt库,命令是:pipinstallxlwt下载pyinstaller库,命令是:pipinstallpyinstaller下载日历库,命令是:pipinstallcalendar下载完成后,可以继续在cmd窗口输入命令:piplisttocheckyourself下载是否成功编码思路到此,基本准备工作完成,现在开始编码过程。首先要有一个思路:对于流水账的数据,先获取单表的支出和收入,然后进入记录流水账的各个表格,获取其中的收入和支出,将汇总的内容写入一个新的excel表格。将ipynb程序转换为.py程序并打包,实现python程序转换为.exe脚本程序(即编写的python程序内容无需打开python编译环境即可自动运行)。想好编码思路后,开始官方编码:导入第三方库在写python程序之前,可以先导入自己需要使用的第三方库。import的语法格式为:import第三方库名。第三方库名称就是我们刚才下载的那个。库【注意:可以使用pyinstaller库,因为这个是把写好的python程序打包成.exe,不需要导入】导入库源码如下【带注释,最好手动输入]:importxlrd#readfromExcelfile用于获取数据和格式化信息的库,支持.xls和.xlsx文件importxlwt#用于将数据和格式化信息写入旧Excel文件的库importcalendar#导入日历库获取表中的收支数据接下来是开始获取单表的收支数据。这里我展示一下我的记账excel模板:从上图可以看出,我黄底红字是当天记账的总结。只要直接获取收支数据对应的表的内容就可以了。所以这里的思路是:先定义一个函数,形参为文件的路径名-->打开文件-->获取目标单元格数据,获取单表支出源码如下【附注释】,最好手动输入]:#获取单表payoutdefget_single_pay(pay_url):#pay_url是payout表的路径#确定文件路径excel_url=str(pay_url)#打开xlsx文件data=xlrd.open_workbook(excel_url)#打开第一个sheettabletable=data.sheets()[0]#获取总支出的单元格内容[index从0开始],即第一行第三列pay=table.cell(0,2).valuereturnpay获取sheet收入表源码如下[有注释,最好手动敲]:#获取单表收入defget_single_income(income_url):#income_url是收入表的路径#确定文件路径excel_url=str(income_url)#打开xlsx文件data=xlrd.open_workbook(excel_url)#打开第一个表table=data.sheets()[0]#获取总收入的单元格内容[index从0开始],即第一行第9列income=table.cell(0,8).valuereturnincome一周收支统计在获取单表收支数据时,需要扩展一下思路。如何获取多个表中的收支数据,其实思路和获取单表数据的思路还是一样的,只是不同的是如何入表不重复相同?这里我用记账的时间作为每张excel表的名字,效果图如下:那么这样就有一个订单,每一张表都是唯一标识的,不过我想想,如果我的记账时间跨度跨越几个月,一周之内,我该如何统计?比如计费时间是2021-5-30到2021-6-5。可以看出,虽然是一周之内,但是他们的月份是不一致的。如何解决?或者从2020-12-31到2021-1-6,不仅月不一样,年也不一样或者说,怎么解决呢?其实无论是同年不同月份还是不同年份不同月份,关键是要把握月份是否一致。所以我在写程序的时候做了一个拆分,就是判断月份是否一致。如果月份一致,按照正常流程就可以获取对应的表数据;但是如果月份不一致,需要分两步,先获取月份的开始日期到结束日期,再获取新月份的1号到结束日期,这样不完美就解决问题了吗刚刚提出?解决日期问题,从统计一周的收支开始。思路是:先定义一个函数,形参为开始账户日期和结束账户日期-->定义两个列表分别存储总支出和总收入的数据-->拆分得到的开始和结束日期打成字符串,分出年月日-->拆分判断-->累加总收入和总支出的表数据-->分别相加存入一个新的空列表中【注:1.拆分判断:如果开始月份和结束月份相同,则调用前面写的函数获取收支数据,添加到对应的总表中;否则分为两部分获取表数据,一是获取当月开始日期到结束日期的收支数据,二是获取新月1号开始的收支数据到结束日期的月份;2.空表的存储顺序是先收入后支出】获取周表收入支出数据的源码如下【有注释,最好手动输入】:#获取收入支出周表的#start取记账开始日期,如2021-5-23#end取记账结束日期,如2021-5-29defget_pay_and_income(start,end):#存储该表的数据本周总支出pays_list=[]#存储本周总收入的数据income_list=[]#分隔开始时间,分为年月日start_split=str(start).split("-")#分开结束时间,分为年月日end_split=str(end).split("-")ifint(start_split[1])==int(end_split[1]):#从this_dayinrange(int(start_split[2]),int(end_split[2])+1):#【this_day指的是一个月中的几天】从指定月份开始到结束#确定文件路径this_excel_url="./Bill/{}-{}-{}.xlsx".format(start_split[0],start_split[1],this_day)#获取单表中支出的单元格内容[indexfrom0start]pay=get_single_pay(this_excel_url)#将获取的数字添加到总支出列表中pays_list.append(pay)#获取单表中收入的单元格内容[indexstartsfrom0]income=get_single_income(this_excel_url)#将得到的数字添加到总收入列表中income_list.append(income)else:#得到这个月的总天数this_month_day=calendar.monthlen(int(start_split[0]),int(start_split[1]))#前半部分:获取指定月份月初到本月底的账单名称forpre_dayinrange(int(start_split[2]),this_month_day+1):#[pre_day指的是数字ofdaysinthismonth/year]#确定文件路径pre_excel_url="./Bill/{}-{}-{}.xlsx".format(start_split[0],start_split[1],pre_day)#获取单元格内容单表中支出的[index从0开始]pay=get_single_pay(pre_excel_url)#将得到的数字添加到总支出列表中pays_list.append(pay)#获取单表中收入的单元格内容[indexstarts从0]收入=get_single_income(pre_excel_url)#将获取的数字添加到总收入列表中income_list.append(income)#After部分:获取新月初到指定月末的账单名称forafter_dayinrange(1,int(end_split[2])+1):#【after_day指新月/新年的天数】#确定文件路径after_excel_url="./bill/{}-{}-{}.xlsx".format(end_split[0],end_split[1],after_day)#获取单表中支出的单元格内容[索引从0开始]pay=get_single_pay(after_excel_url)#将得到的数字添加到总支出列表中pays_list.append(pay)#获取单表中的收入单元格内容[索引从0开始]income=get_single_income(after_excel_url)#将获取的数字添加到总收入列表中income_list.append(income)#呈现收入和支出一周的列表格式pays_incomes_list=[]#创建一个空列表来存储pays_incomes_list.append(sum(pays_list))#Put将统计的支出列表放入空列表pays_incomes_list.append(sum(incomes_list))#将统计的收入列表放入空列表returnpays_incomes_list#返回的内容为支出-收入字典的内容。将新的统计数据写入表恭喜,您已经获得了想要的每周收支数据的汇总,现在将其添加到新表中思路是:定义一个函数,参数为记账起止日期-->创建表格和表格-->将汇总后的数据写入对应的目标单元格-->确定存储地址-->来源保存一周账户数据汇总及书写代码如下【带注释,最好手动输入】:#一周内容结论#start取记账开始日期,如2021-5-23#end取结束ofbookkeepingDate,suchas2021-5-29defwrite_pay_and_income(start,end):#创建工作簿workbook=xlwt.Workbook()#注意Workbook开头要大写#创建一个sheet对象,设置工作簿名称sheetsheet=workbook.add_sheet("七日总结",cell_overwrite_ok=True)#将标题写到sheet页面的(0,0)位置sheet.write(0,0,"收支情况分析aweek")#写到sheetpage的(2,0)位置写“总支出”sheet.write(2,0,"TotalExpenditure")#Write"TotalIncome"toposition(2,1)ofthesheetpagesheet.write(2,1,"TotalIncome")#将“剩余利润”写入sheetpage的位置(2,2)sheet.write(2,2,"residualprofit")#获取周表收支数据accounts_value=get_pay_and_income(start,end)#sendtoWritesheetpage位置(3,0)处的支出数据sheet.write(3,0,accounts_value[0])#在sheetpage的位置(3,1)写入收益数据sheet.write(3,1,accounts_value[1])#计算周表剩余利润profit=accounts_value[1]-accounts_value[0]#将剩余利润数据写入sheet页面的位置(3,2)sheet.write(3,2,profit)#确定文件保存路径save_url="./bill/Summarytable从{}到{}.xls".format(start,end)#[只能是xls,不能是xlsx]#保存excel文件,如果有同名文件直接覆盖workbook.save(save_url)print("writecompleted")自定义交互不知道大家有没有注意到,我写的python程序都是用函数封装的,每个函数都实现了一个特定的功能,所以需要调用出来才能使用,而且,为了让这个自动记账程序继续运行下去使用,其记账的起止日期不能固定,所以我使用了输入函数,可以实现用户将起止日期实时输入到函数中进行汇总统计,这也是我定义的原因函数,将记账开始日期和结束日期作为函数形参进行交互的源码如下[有注释,最好手动输入]:start_time=input("starttime:")#input2021-5-23end_time=input("结束时间:")#输入2021-5-29write_pay_and_income(start_time,end_time)生成统计excel效果图如下:生成.exe程序至此,你已经完成了核心编码过程,现在是时候将你制作好的程序编写成.exe程序了。这个想法是:将.ipynb转换为.py文件-->从.py程序生成.exe文件。这里是将.ipynb转成.py文件。这里是一个.py程序生成.exe文件并打开cmd窗口,然后输入以下命令:pyinstaller-F(脚本路径+脚本名),脚本路径就是你当前存放.py程序的位置,而脚本名称就是你当前.py程序的名称,效果生成.exe程序的截图如下图:根据exe保存路径,可以放在指定运行的文件夹中找到环境后,双击运行【注意:使用输入实现与用户的交互;同一个文件重新打包,会覆盖原来打包的内容]效果图如下:[注:此gif有些投影不足。我在自定义日期的时候,格式是年-月-日。不要丢掉“-”]结语当然,这里的程序还有很多不足和需要改进的地方,比如没有分类划分,没有图形化界面显示等,这些不足会持续更新……