使用Python写一个对文本进行读取和修改的小工具

这个想法起源于公司繁琐的报销流程,报销申请提交上去之后需要较长的时间才能走完流程,导致在报销签字的时候自己都不记得是哪次的报销了,刚好最近在自学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
到此为止基本的功能已经完善了,接下来就是做一些功能上的延伸,如:添加输入验证,文件验证;引入时间模块,添加不填时间则默认当前日期为时间功能;设计界面;引入用户,每个用户一个对应的文件;使用数据库,对部门所有成员的报销进行管理等。
目前能想到的和实现的就这些,望大佬们多多批评指正,菜鸟在此拜谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值