共计 6335 个字符,预计需要花费 16 分钟才能阅读完成。
需要背景:
为了更好的解放双手,进步记账效率,自己想要制作一个基于 python 的自动化记账程序,用于统计自己每星期、每月、每年,甚至是每日的盈亏记录,目前该程序是处于半自动化状态,前期会逐步更新,争取全套流程纯自动化,不须要过多的人工参加,解脱苦哈哈记账统计的耗时工作。
需要总指标:
日账目:连贯罕用的领取通信软件,将本人每破费一笔,就主动归类在一个长期存储地位,而后这个长期存储地位能够用 excel 格局记录存储,并将其下载到指定的电脑桌面地位。
星期账目:对一星期的花销和盈收做出统计,并用图的形式展现各种类花销状况和支出状况。
月账目:对一个月(即四个星期)的花销和盈收做出统计,并用图的形式展现各种类花销状况和支出状况。
年账目:对一年(即 12 个月)的花销和盈收做出统计,并用图的形式展现各种类花销状况和支出状况
本次记账程序 1.0 的指标:
对一星期(即 2021 年 5 月 23 日 至 2021 年 5 月 29 日)的盈收状况统计,能够得出其一星期的总收入、总支出、残余额【注:本次编写不会介绍太多理论性的货色,纯小白实操教程】
具体内容:
后期筹备工作
本次基于 python 记账程序的实现,前提要部署好 python 的编译环境,这里自己应用 anaconda 里的 jupyter notebook 作为编译器,如若不会装置,这里有传送门:
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 库:
pip install xlrd
效果图如下:
同理:下载实现后,持续下载 xlwt 库,命令为:
pip install xlwt
下载 pyinstaller 库,命令为:
pip install pyinstaller
下载 calendar 库,命令为:
pip install calendar
下载实现后,能够持续在 cmd 窗口输出命令:pip list,用于查看本人是否下载胜利
编码思路
到这里,根本的筹备工作是实现了,当初就开始到编码环节了。首先要有思路:
- 对于日记账的数据,先要获取单张表的收入和支出
- 进入到每个记录日记账的表格去获取其中的收支状况
- 将汇总好的内容写入到新的 excel 表格中
- 将.ipynb 的程序转成.py 程序,并将其打包,实现 python 程序转化为.exe 的脚本程序(即不关上 python 编译环境就能够主动运行写好的 python 程序内容)
开始编码
思路想好后,就正式编码了:
导入第三方库
在写 python 程序前,能够将须要应用到的第三方库先进行导入,导入的语法格局是:import 第三方库名,这个第三方库名就是咱们方才下载的那些库【注:pyinstaller 库能够不必,因为这个是将写好的 python 程序打包成.exe,不必导入进来】
导入库的源码如下【含正文,最好手动敲写】:
import xlrd# 从 Excel 文件读取数据和格式化信息的库,反对.xls 以及.xlsx 文件
import xlwt# 用于将数据和格式化信息写入旧 Excel 文件的库
import calendar# 导入日历库
获取表格里的收支数据
接下来是开始获取单张表的收支数据,这里我展现一下我的记账 excel 模板是:
能够从上图看到,我的黄底红字那里,是对当天记账状况的总结,只有间接获取收支数据对应的表格内容即可。故这里的思路是:
先定义一个函数, 形参是参数是文件的路径名 --> 关上文件 --> 获取指标单元格数据
获取单张表收入的源码如下【含正文,最好手动敲写】:
# 获取单张表的收入
def get_single_pay(pay_url):# pay_url 为收入表的门路
# 确定文件门路
excel_url = str(pay_url)
# 关上 xlsx 的文件
data = xlrd.open_workbook(excel_url)
#关上第一张表
table = data.sheets()[0]
# 获取总支出的单元格内容【索引从 0 开始】,即第一行的第三列
pay = table.cell(0,2).value
return pay
获取单张表支出的源码如下【含正文,最好手动敲写】:
# 获取单张表的支出
def get_single_income(income_url):# income_url 为支出表的门路
# 确定文件门路
excel_url = str(income_url)
# 关上 xlsx 的文件
data = xlrd.open_workbook(excel_url)
#关上第一张表
table = data.sheets()[0]
# 获取总收入的单元格内容【索引从 0 开始】,即第一行的第九列
income = table.cell(0,8).value
return income
统计一星期的收支状况
在获取单个表格里的收支数据,就要把思路拓展了,如何能力获取多个表格里的收支数据,其实思路还是和获取单个表格数据的思路是统一的,只是不同的是,如何能力进入表格里,而且还是不重样呢?
这里我应用的是用记账的工夫来作为每个 excel 表格的命名,效果图如下:
那这样子就有程序了,而且每个表格都是惟一标识的,然而,我转念一想,如果我记账的工夫是跨月的,然而又是在一星期的范畴内,我该如何统计呢?比如说记账工夫是 2021-5-30 到 2021-6-5,能够看到尽管是在一星期的范畴内,可是他们的月份却是不统一的,该如何解决呢?又或者是 2020-12-31 到 2021-1-6,不单单是月份不一样,连年份也不以言,又该如何解决呢?
其实,无论是同年不同月,还是不同年也不同月,要害要抓住月份是否统一就够了,因而我在写程序时,做了一个分流,即判断月份是否统一,如果月份统一,就依照失常程序获取对应的表格数据即可;可是如果月份不统一,就须要分成两部步,先获取开始的日期到该月完结的日期,在获取新月的 1 号到完结的日期,不就能完满的解决方才提出的问题的吗?
解决日期的问题,就开始统计一星期的收支状况了,思路是:
先定义一个函数, 形参别离是开始账目的日期和完结账目的日期
-->
定义两个列表, 用于存储总支出和总收入的数据
-->
将获取的开始和完结日期进行字符串宰割, 独立出其年月日
-->
分流判断
-->
将总收入和总支出的表格数据别离累加
-->
别离增加到一个新的空列表中存储
【注:
1、分流判断:如果开始的月份和完结的月份统一,则调用之前写好的获取收支数据的函数,并增加到对应的总列表中;否则分成两局部获取表格数据,一个是获取开始的日期到该月完结的日期的收支数据,另一个是获取新月的 1 号到完结的日期的收支数据;
2、空列表存储的程序是先收入后支出】
获取一星期表收支数据的源码如下【含正文,最好手动敲写】:
# 获取一星期的表的支出和收入
# start 取记账的开始日期,如 2021-5-23
# end 取记账的完结日期,如 2021-5-29
def get_pay_and_income(start,end):
# 存储一星期总支出的数据
pays_list = []
# 存储一星期总收入的数据
incomes_list = []
# 分隔开始工夫,分成年月日
start_split = str(start).split("-")
# 分隔完结工夫,分成年月日
end_split = str(end).split("-")
if int(start_split[1]) == int(end_split[1]):
# 获取指定这个月的开始 到 完结的账单名
for this_day in range(int(start_split[2]),int(end_split[2])+1):#【this_day 指的是月的天数】# 确定文件门路
this_excel_url = "./ 账单 /{}-{}-{}.xlsx".format(start_split[0],start_split[1],this_day)
# 获取单表中收入的单元格内容【索引从 0 开始】pay = get_single_pay(this_excel_url)
# 将获取的数字退出到总支出列表中
pays_list.append(pay)
# 获取单表中支出的单元格内容【索引从 0 开始】income = get_single_income(this_excel_url)
# 将获取的数字退出到总收入列表中
incomes_list.append(income)
else:
# 获取这月的总天数
this_month_day = calendar.monthlen(int(start_split[0]),int(start_split[1]))
# 前局部:获取指定月的开始 到 这月完结的账单名
for pre_day in range(int(start_split[2]),this_month_day+1):#【pre_day 指的是这个月 / 年的天数】# 确定文件门路
pre_excel_url = "./ 账单 /{}-{}-{}.xlsx".format(start_split[0],start_split[1],pre_day)
# 获取单表中收入的单元格内容【索引从 0 开始】pay = get_single_pay(pre_excel_url)
# 将获取的数字退出到总支出列表中
pays_list.append(pay)
# 获取单表中支出的单元格内容【索引从 0 开始】income = get_single_income(pre_excel_url)
# 将获取的数字退出到总收入列表中
incomes_list.append(income)
# 后局部:获取新月的开始 到 指定月完结的账单名
for after_day in range(1,int(end_split[2])+1):#【after_day 指的是新月 / 新年的天数】# 确定文件门路
after_excel_url = "./ 账单 /{}-{}-{}.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)
# 将获取的数字退出到总收入列表中
incomes_list.append(income)
# 将一星期的支出和收入,用列表格局出现
pays_incomes_list = []# 创立一个空列表存储
pays_incomes_list.append(sum(pays_list))# 将统计好的收入列表,装进空列表中
pays_incomes_list.append(sum(incomes_list))# 将统计好的支出列表,装进空列表中
return pays_incomes_list# 返回的内容为收入 - 支出字典内容
将统计的新数据写入表格
祝贺你,到这里你曾经获取了想要的一星期收支数据的汇总状况,当初将其增加到新的表格中。思路是:
定义一个函数, 参数为开始记账和完结记账日期
-->
创建表格和表单
-->
将汇总好的数据, 向对应的指标单元格写入
-->
确定保留地址
-->
实现保留
一星期账目数据汇总写入的源码如下【含正文,最好手动敲写】:
# 一星期内容汇总
# start 取记账的开始日期,如 2021-5-23
# end 取记账的完结日期,如 2021-5-29
def write_pay_and_income(start,end):
# 创立 workbook
workbook = xlwt.Workbook()# 留神 Workbook 的结尾要大写
# 创立 sheet 对象,并设置 sheet 的名称
sheet = workbook.add_sheet("七天汇总",cell_overwrite_ok=True)
# 向 sheet 页的(0,0)地位写入题目
sheet.write(0,0,"一星期的收支状况剖析")
# 向 sheet 页的(2,0)地位写入“总支出”sheet.write(2,0,"总支出")
# 向 sheet 页的(2,1)地位写入“总收入”sheet.write(2,1,"总收入")
# 向 sheet 页的(2,2)地位写入“残余利润”sheet.write(2,2,"残余利润")
# 获取一星期表的支出和收入的数据
accounts_value = get_pay_and_income(start,end)
# 向 sheet 页的(3,0)地位写入收入数据
sheet.write(3,0,accounts_value[0])
# 向 sheet 页的(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 = "./ 账单 /{}到 {} 的汇总表.xls".format(start,end)#【只能是 xls,而不能是 xlsx】# 保留该 excel 文件,有同名文件间接笼罩
workbook.save(save_url)
print("写入实现")
自定义交互
不晓得你有没有发现,我写的 python 程序都是应用函数进行封装的,每个函数实现某个特定的性能,所以要应用须要将其调用进去,并且,为了能使这个自动化记账程序可能继续应用,其记账的开始和完结日期肯定不能写固定的,因而我应用了 input 函数,它能够实现将用户输出的开始和完结日期,实时放进函数中进行汇总统计,这就是我为什么定义函数时,要把开始记账日期和完结记账日期作为函数的形参。
交互的源码如下【含正文,最好手动敲写】:
start_time = input("开始工夫:") # 输出 2021-5-23
end_time = input("完结工夫:")# 输出 2021-5-29
write_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 保留门路,找到后能够搁置在指定运行环境的文件夹下,双击就可运行【注:应用 input 就能够实现与用户交互;雷同的文件从新打包,会将本来打包的内容笼罩】
效果图如下:【留神:这个 gif 有些投影有余,是我在自定义日期时,格局是年 - 月 - 日,这个“-”切记不要失落了】
结语
当然,此处程序还是有挺多的有余和须要改良的中央的,比方没有对品种进行划分,没有用图形化的界面展现等,这些有余将会继续的更新…