这个想法起源于公司繁琐的报销流程,报销申请提交上去之后需要较长的时间才能走完流程,导致在报销签字的时候自己都不记得是哪次的报销了,刚好最近在自学Python,遂决定用Python写一个报销记录工具。
构思的大致流程:
记录文本格式:编号+是否完成标志+提交时间+金额+出差时长+结束时间+金额
例:1-Y-20190506-1000-10-20190526-1800【完成的】
例:2-N-20190607-1000-10【未完成的】
应用流程:开始->(新增报销/结束报销/查看所有记录/结束)->
【新增:提交报销日期->提交金额->提交时长->显示当前未完成报销】->开始
【结束:提交报销编号->提交结束日期->提交金额->显示当前未完成报销】->开始
【查看:显示所有记录】->开始
【结束:结束程序】
最初的想法是使用Python file直接进行文件操作,尝试后发现file下的相关函数并不能直接做到对各列的修改,单纯的写入/删除简单,要对某行进行修改和增加,我还没找到较好的办法。思考后决定引入容器,将文本内容读取到列表中,通过列表对文本内容进行修改,在修改完成后再将列表内容写回到文本。
读取文本模块:只读模式读取文件,并写入到列表,并返回列表
def openfile():
print("开始读取文件")
fb = open("报销记录.txt",mode = 'r')
lines = []
for line in fb:
#str(line).replace('\n','')
lines.append(line)
print("读取完成")
fb.close()
return lines
添加记录模块:对列表进行修改,最后把列表更新到文本
def addline(line,getline,date,money,days):
print("添加前:",line)
line.append("%d N %d %d %d "%(getline,date,money,days))
print("添加后:",line)
fb = open("报销记录.txt",mode = 'w')
for i in range(len(line)):
#去除[],单引号和换行符;
#此处不去掉换行符的话,换行符将以文本形式出现在文件中,写回文件的文本不会换行
s = str(line[i]).replace('[','').replace(']','').replace("'",'').replace(',','').replace('\n','')
print(s)
fb.write(s)
fb.write('\n') #加入换行
print("添加成功")
fb.close()
结束记录模块:修改文本中的标志位,并添加后续内容,最后将列表更新到文本
def endline(line,num,date,money):
#print(line[num]) #验证输出
#string.replace('','')修改字符串后需要另行赋值
#在发现这个问题之前尝试使用遍历修改,实验发现也不行,当次的'N'变成'Y'了,退出for循环之后'N'还是'N'
"""for i in line[num]:
#try:
if i == 'N':
i = 'Y'
print(i)"""
#line[num].replace('N','Y') 此时line[num]中的'N'依旧是'N'
line[num] = line[num].replace('N','Y')
#print(line[num]) #验证输出
addstr = str(date) + ' ' + str(money)
line[num] += addstr #提取出来的line[num]是一个字符串类型,使用字符串拼接连接后续内容
#line[num].__add__("%d %d"%(date,money))
#print(line) #验证输出
fb = open("报销记录.txt",mode = 'w')
for i in range(len(line)):
#去除[],单引号和换行符
s = str(line[i]).replace('[','').replace(']','').replace("'",'').replace(',','').replace('\n','')
print(s)
fb.write(s)
fb.write('\n')
print("添加成功")
fb.close()
主体部分:通过反复获取用户输入进行程序
while True:
choose = int(input("选择你要进行的操作:\n1.提交报销\n2.结束报销\n3.查看所有记录\n4.结束程序\n输入:"))#功能选择
fb = open("报销记录.txt",mode = 'a')#确保文件存在,若不存在则在当前目录新建一个
fb.close()
if choose == 1:
fb = open("报销记录.txt",mode = 'r')#打开记录文本
getline = 0 #获取当前行数,即最后一个编号
for line in fb.readlines():
getline += 1
fb.close()
date = int(input("输入提交日期,如:20190101\n输入:"))#获取日期,金额和时长
money = int(input("输入报销金额\n输入:"))
days = int(input("输入出差时长\n输入:"))
line = openfile()
addline(line,getline,date,money,days)
print("添加成功!")
elif choose == 2:
fb = open("报销记录.txt",mode = 'r')#打开记录文本
getline = 0 #获取当前行数,即最后一个编号
for line in fb.readlines():
getline += 1
fb.close()
num = int(input("输入要结束的编号\n输入:"))
date = int(input("输入提交日期,如:20190101\n输入:"))#获取日期和金额
money = int(input("输入报销金额\n输入:"))
line = openfile()
endline(line,num,date,money)
print("添加成功!")
elif choose == 3:
line = openfile()
for i in line:
print(i)
elif choose == 4:
break
效果展示:
调试环境为vscode
到此为止基本的功能已经完善了,接下来就是做一些功能上的延伸,如:添加输入验证,文件验证;引入时间模块,添加不填时间则默认当前日期为时间功能;设计界面;引入用户,每个用户一个对应的文件;使用数据库,对部门所有成员的报销进行管理等。
目前能想到的和实现的就这些,望大佬们多多批评指正,菜鸟在此拜谢!