需求,有一个配置文件test.conf内容以下python
backend www1 server 1 server 2 backend www2 server 3 server 4 add [{'backend':'www1','server':'3'}] change [{'backend':'www1','server':'1'},{'backend':'www1','server':'3'}] delete [{'backend':'www1','server':'1'}]
1,自定义函数实现查询功能,查询须要根据用户输入的关键字进行查询如输入www1则查询出对应的下面的配置app
2,自定义函数实现添加功能,好比在关键字www1后面添加一个配置为server 3ide
3,自定义函数实现修改功能,好比把server 1修改为 server 3函数
4,自定义函数实现删除功能,好比把www1后面的server 1删除fetch
day21-1.pyserver
def fetch(data): print('这是查询函数,用户的输入是%s' %data) #data = 'www1' backend_data = 'backend %s' %data #backend_data = 'backend www1' #以只读方式打开文件若是遇到对应的关键行,这里的关键行是 backend www1则把标签置为True #须要输出的是关键行和下一个关键行之间的数据,因此假如循环到下一个以backend开头的关键字则退出整个循环 #假如遇到查询的关键行而且尚未遇到下一个以backend开头的关键行则tag值为True打印两行之间的数据 #而且把数据追加到列表中做为返回值返回 with open('test.conf','r') as read_f: tag = False ret = [] for read_line in read_f: if read_line.strip() == backend_data: tag = True continue if tag and read_line.startswith('backend'): break if tag: print(read_line,end='') ret.append(read_line) return ret #ret = [' server 1\n', ' server 2\n', '\n'] def add(data): print('这是添加函数,用户输入的数据是%s' %data) #data = [{'backend':'www1','server':'3'}] backend = data[0]['backend'] # backend = 'www1' backend_data = 'backend %s' % backend # backend_data = 'backend www1' res = fetch(backend) # res = [' server 1\n', ' server 2\n', '\n'] add_server_record = '%sserver %s\n' %(' '*4,data[0]['server']) #add_server_record = ' server 3\n' if not res: print('修改的数据不存在') elif add_server_record in res: print('须要修改的数据重复') else: res.insert(-1,add_server_record) #res = [' server 1\n', ' server 2\n', ' server 3\n','\n'] res.insert(0,'%s\n' %backend_data) #res = ['backend www1\n',' server 1\n', ' server 2\n', ' server 3\n','\n'] with open('test.conf','r') as read_f,open('test.conf_new','w') as wirte_f: tag = False has_write = False for read_line in read_f: if read_line.strip() == backend_data: tag = True continue if read_line.startswith('backend'): tag = False if not tag: wirte_f.write(read_line) else: if not has_write: for record in res: wirte_f.write(record) has_write = True def change(data): #data是一个特定格式的列表,前面包含了须要修改的旧数据的一个字典,后面包含了须要改为什么的字典 #由于input接收输入格式为字符串因此须要在输入数据的时候断定以前输入的选项若是不是1查询功能则须要把字符串经过eval函数方法转换成列表格式 print('这是修改函数,用户输入的数据是%s' % data) #data = [{'backend':'www1','server':'1'},{'backend':'www1','server':'3'}] #根据列表及字典索引取出须要查询的关键字www1 做为查询函数fetch的参数 backend = data[0]['backend'] #backend = 'www1' #根据须要查询的关键字加backend拼接出关键行 backend_data = 'backend %s' %backend #backend_data = 'backend www1' #根据取出的关键字www1查询而且把结果返回给一个列表res 这个列表做为一会修改时须要写入文件的之后列表 res = fetch(backend) # res = [' server 1\n', ' server 2\n', '\n'] #根据用户输入取出须要修改的旧数据和须要修改为什么的新数据,须要加换行符\n old_server_record = '%sserver %s\n' %(' '*4,data[0]['server']) #old_server_record = ' server 1\n' new_server_record = '%sserver %s\n' %(' '*4,data[1]['server']) #old_server_record = ' server 3\n' #判断调用查询函数fetch返回的列表res是否为空以及须要修改的旧数据是否在列表中,若是其中一条不成立及返回数据不存在 if not res or old_server_record not in res: print('须要修改的数据不存在') #若是知足以上条件res有返回值而且修改的旧数据在res里面则先找出就数据的索引而后根据索引把旧数据替换成须要修改的新数据 #由于res没有返回关键行的数据因此须要把关键行插入列表res中 else: index = res.index(old_server_record) #index=0 res[index] = new_server_record #res = [' server 3\n', ' server 2\n', '\n'] res.insert(0,'%s\n' %backend_data) #res = ['backend www1\n',' server 3\n', ' server 2\n', '\n'] #以只读方式打开文件test.conf以写方式打开新文件test.conf_new而且定义两个补签tag和has_write #tag补签用来识别是直接写原文件内容仍是写新列表内容 #has_write补签用来识别列表内容是否已经写过一遍了,若是已经写过一遍就无需重复写入了 with open('test.conf','r') as read_f,open('test.conf_new','w') as write_f: tag = False has_write = False for read_line in read_f: if read_line.strip() == backend_data: tag = True continue if tag and read_line.startswith('backend'): tag = False if not tag: write_f.write(read_line) else: if not has_write: for record in res: write_f.write(record) has_write = True def delete(data): print('这是删除函数,用户输入的数据是%s' %data) #data = [{'server': '1', 'backend': 'www1'}] backend = data[0]['backend'] # backend = 'www1' backen_data = 'backend %s' % backend # backend_data = 'backend www1' res = fetch(backend) # res = [' server 1\n', ' server 2\n', '\n'] del_server_record = '%sserver %s\n' % (' ' * 4, data[0]['server']) # del_server_record = ' server 1\n' if not res or del_server_record not in res: print('须要删除的内容不存在') else: res.remove(del_server_record) #res = [' server 2\n', '\n'] res.insert(0, '%s\n' % backen_data) #res = ['backend www1\n',' server 2\n', '\n'] with open('test.conf','r') as read_f,open('test.conf_new','w') as write_f: tag = False has_write = False for read_line in read_f: if read_line.strip() == backen_data: tag = True continue if tag and read_line.startswith('backend'): tag = False if not tag: write_f.write(read_line) else: if not has_write: for record in res: write_f.write(record) has_write = True 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('请输入选项:') #若是输入为空则退出本次循环从新输入 if choice == '':continue #若是输入为5则退出程序 if choice == '5':break data = input('请输入数据:') #若是不是选项1执行操做则须要把输入的字符串类型转换成对应的列表类型 if choice != '1': data = eval(data) #根据用户输入的choic和data数据执行对应的函数 res = msg_dic[choice](data) print('最终返回结果是%s' %res)