需求,有一個配置文件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)