python——文件查询、修改操作练习
def file_handle(backend_data,res = None,type = 'fetch'): if type == 'fetch': ret = [] with open('haproxy','r') as read_f : tag = False for read_line in read_f: if read_line.strip() == backend_data: tag = True continue if tag and read_line.startswith('backend'): break #server读完,读到下一个backend时,关闭for循环,否则就会将 backend www.oldboy1.org后面的内容全部读出来 if tag : print('\033[1;45m%s\033[0m'%read_line,end = '') #把读到的哪一行server打印出来 ret.append(read_line) #将满足条件的哪一行server添加到列表中 return ret #函数返回该列表,及返回查询结果 elif type == 'change': import os with open ('haproxy','r') as read_f, open('haproxy_new','w') as write_f: tag = False has_write = False #设置has_write 阀门 是为了防止每一次server都运行一遍 for record in res: 如果这样,新文件中就会有四条修改过的backend www.oldboy1.org的相关内容 for read_line in read_f: if read_line.strip() == backend_data: tag = True continue if tag and read_line.startswith('backend'): tag = False #如果此处不对tag进行关闭,那么在新文件中写完backend www.oldboy1.org内的server就会停止 if not tag: write_f.write(read_line) else: if not has_write: for record in res: #把新纪录写在新文件中 write_f.write(record) has_write = True os.rename('haproxy','haproxy.bak') #此三步操作是使新文件覆盖老文件,先将老文件换名,再将新文件换成老文件原来的名,在删除老文件 os.rename('haproxy_new','haproxy') os.remove('haproxy.bak') def fetch(data): print('\033[1;43m这是查询功能\033[0m') print('\033[1;43m用户数据是\033[0m ',data) backend_data = 'backend %s' %data return file_handle(backend_data) def add(): pass def change(data): print('这是修改功能') print('用户输入的数据是',data) backend = data[0]['backend'] #文件当中的一条记录 如 www.oldboy1.org backend_data = 'backend %s' %backend old_server_record = '%sserver %s weight %s maxconn %s\n' % (' '*8,data[0]['record']['server'],data[0]['record']['weight'],data[0]['record']['maxconn']) #因为传进来的参数是列表(内包含两个字典),通过此语句将要修改的数据拼接成完整的字符串 new_server_record = '%sserver %s weight %s maxconn %s\n' % (' '*8,data[1]['record']['server'],data[1]['record']['weight'],data[1]['record']['maxconn']) print('用户想要修改的记录是',old_server_record) res = fetch(backend) #获取backend 后的server内容 if not res or old_server_record not in res: return '你要修改的记录不存在' else: index = res.index(old_server_record) res[index] = new_server_record #先在列表中完成新老记录的修改,此处用新记录代替老记录 res.insert(0,'%s\n' %backend_data) #此处不能用append,因为调用此方法会将 backend_data 数据,将其添加到开头,因此应用insert方法添加到列表末尾,此语句的作用是避免新文件没有backend...,因为在此之前,res的列表种不包含backend... file_handle(backend_data,res = res,type = 'change') def delete(): pass if __name__ == '__main__': msg = ''' 1:查询, 2:添加, 3:修改, 4:删除, 5:退出, ''' msg_dic = { '1':fetch, '2':add, '3':change, '4':delete, } while True: print(msg) choice = input('请输入你的选项:').strip() if not choice : continue if choice == '5': break data = input('请输入你的数据:').strip() if choice != '1': data = eval(data) res = msg_dic[choice](data) print('最终的结果是',res) # 修改信息:[{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4 2.2.2.4','weight':20,'maxconn':3000}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5 2.2.2.5','weight':30,'maxconn':4000}}]
总结:(1)练习函数的编程
(2)文件的处理
(3)解耦:把查询功能和修改功能的部分代码移动到file_handle() 函数中,这就可以看作是程序的解耦
(4)tag的用法:程序中tag和has_write的用法,使函数在适当的时候停止,注意看在函数中 tag 的用法