Python--综合练习--对文件进行增删改查
知识点应用:strip()
tag
函数封装
文件操作
for循环
os模块
代码解耦
实例
tag = True while tag: print('level') choice = input('level1>>:').strip() while tag: print('level2') choice = input('level2>>:').strip() if choice == 'quit':break #t退到上一层 if choice == 'quit_all': tag = False # 退出全部 while tag: print('level3') choice = input('level3>>>:').strip() if choice == 'quit': break #t退到上一层 if choice == 'quit_all':tag = False #退出全部
未封装实例
import os #引入os模块 def fetch(data): #查询 backend_data = 'backend %s' %data with open('haproxy.conf','r') as read_f: tag = False ret = [] for read_line in read_f: if read_line.strip() == backend_data: #这里说明匹配到想要的内容 tag = True #tag 的状态应当要改变 continue #跳过当前行 ''' 退出规则 当tag = True 时 说明匹配到想要的内容 循环文件是一行一行的循环 当backend_data = global、defaults、listen、frontend时都不会进入if里面执行 当碰见一个backend时 tag变为True并跳出当前循环执行下一次循环 这时进来的是 server 101.1000.7.9 101.1000.7.9 weight 20 maxconn 30 server 2.2.2.7 2.2.2.7 weight 30 maxconn 4000 server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000 server 2.2.2.5 2.2.2.5 weight 30 maxconn 4000 程序不会执行 if tag and read_line.startswith('backend'): break tag为True状态没改变而继续执行 if tag: print('\033[1;45m%s\033[0m' %read_line,end='') # 打印匹配到的内容 直到又遇到backend www.oldboy2.org 时 执行 if tag and read_line.startswith('backend'): break ''' if tag and read_line.startswith('backend'): # tag = False #tag = False for循环依然会执行下去 break if tag: ret.append(read_line) # print('\033[1;45m%s\033[0m' %read_line,end='') # 打印匹配到的内容 return ret def add(): pass def change(data): #修改文件 backend = data[0]['backend'] #backend = www.oldboy1.org backend_data = 'backend %s' %backend #得到:www.oldboy1.org ''' 拼接字符串 :' server 2.2.2.5 2.2.2.5 weight 30 maxconn 4000' ''' old_server_record = '%sserver %s %s weight %s maxconn %s\n' %(' '*8,data[0]['record']['server'],data[0]['record']['server'],data[0]['record']['weight'],data[0]['record']['maxconn']) #print('用户想要修改的数据是:',old_server_record) new_server_record = '%sserver %s %s weight %s maxconn %s\n' %(' '*8,data[1]['record']['server'],data[1]['record']['server'],data[1]['record']['weight'],data[1]['record']['maxconn']) ''' data[0]是要被修改为data[0]的数据,类似data[0]是存在数据库中的,即将被更新为data[1] ''' res = fetch(backend) #根据索引查询出数据 #print(res) 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) with open('haproxy.conf','r') as read_f,open('haproxy_new.conf','w') as writ_f: tag = False has_write = False for read_line in read_f: if read_line.strip() == backend_data: ''' 原理类似查询 找到匹配位置,改变状态tag = True 把修改的列表写入文件 ''' tag = True continue if tag and read_line.startswith('backend'): tag = False if not tag: writ_f.write(read_line) else: if not has_write: #防止有多少个server写多少次 for record in res: writ_f.write(record) has_write = True os.rename('haproxy.conf','haproxy.conf.bak') #备份源文件 os.rename('haproxy_new.conf','haproxy.conf') #修改新的文件名为原来的文件名 #os.remove('haproxy.conf.bak') #删除备份文件 def delete(): pass #data[0]是要被修改为data[0]的数据,类似data[0]是存在数据库中的,即将被更新为data[1] 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('\033[1;43m请输入您的选项\033[0m:') if not choice:continue if choice == 5:break data = input('请输入您的数据:').strip() if choice != '1': data = eval(data) ret = msg_dic[choice](data) #拿到查询到的返回值 print(ret) # [{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':3,'maxconn':4000}}]
封装函数file_handler() 提取文件处理解耦部分
import os # 引入os模块 def file_handler(backend_data,res = None,type = 'fetch'): if type == 'fetch': with open('haproxy.conf', 'r') as read_f: tag = False ret = [] for read_line in read_f: if read_line.strip() == backend_data: # 这里说明匹配到想要的内容 tag = True # tag 的状态应当要改变 continue # 跳过当前行 ''' 退出规则 当tag = True 时 说明匹配到想要的内容 循环文件是一行一行的循环 当backend_data = global、defaults、listen、frontend时都不会进入if里面执行 当碰见一个backend时 tag变为True并跳出当前循环执行下一次循环 这时进来的是 server 101.1000.7.9 101.1000.7.9 weight 20 maxconn 30 server 2.2.2.7 2.2.2.7 weight 30 maxconn 4000 server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000 server 2.2.2.5 2.2.2.5 weight 30 maxconn 4000 程序不会执行 if tag and read_line.startswith('backend'): break tag为True状态没改变而继续执行 if tag: print('\033[1;45m%s\033[0m' %read_line,end='') # 打印匹配到的内容 直到又遇到backend www.oldboy2.org 时 执行 if tag and read_line.startswith('backend'): break ''' if tag and read_line.startswith('backend'): # tag = False #tag = False for循环依然会执行下去 break if tag: ret.append(read_line) # print('\033[1;45m%s\033[0m' %read_line,end='') # 打印匹配到的内容 return ret elif type == 'change': with open('haproxy.conf', 'r') as read_f, open('haproxy_new.conf', 'w') as writ_f: tag = False has_write = False for read_line in read_f: if read_line.strip() == backend_data: ''' 原理类似查询 找到匹配位置,改变状态tag = True 把修改的列表写入文件 ''' tag = True continue if tag and read_line.startswith('backend'): tag = False if not tag: writ_f.write(read_line) else: if not has_write: # 防止有多少个server写多少次 for record in res: writ_f.write(record) has_write = True os.rename('haproxy.conf', 'haproxy.conf.bak') # 备份源文件 os.rename('haproxy_new.conf', 'haproxy.conf') # 修改新的文件名为原来的文件名 os.remove('haproxy.conf.bak') #删除备份文件 def fetch(data): # 查询 backend_data = 'backend %s' % data return file_handler(backend_data) def add(): pass def change(data): # 修改文件 backend = data[0]['backend'] # backend = www.oldboy1.org backend_data = 'backend %s' % backend # 得到:www.oldboy1.org ''' 拼接字符串 :' server 2.2.2.5 2.2.2.5 weight 30 maxconn 4000' ''' old_server_record = '%sserver %s %s weight %s maxconn %s\n' % ( ' ' * 8, data[0]['record']['server'], data[0]['record']['server'], data[0]['record']['weight'], data[0]['record']['maxconn']) # print('用户想要修改的数据是:',old_server_record) new_server_record = '%sserver %s %s weight %s maxconn %s\n' % ( ' ' * 8, data[1]['record']['server'], data[1]['record']['server'], data[1]['record']['weight'], data[1]['record']['maxconn']) ''' data[0]是要被修改为data[0]的数据,类似data[0]是存在数据库中的,即将被更新为data[1] ''' res = fetch(backend) # 根据索引查询出数据 # print(res) 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) return file_handler(backend_data,res = res,type = 'change') def delete(): pass # data[0]是要被修改为data[0]的数据,类似data[0]是存在数据库中的,即将被更新为data[1] 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('\033[1;43m请输入您的选项\033[0m:') if not choice: continue if choice == 5: break data = input('请输入您的数据:').strip() if choice != '1': data = eval(data) ret = msg_dic[choice](data) # 拿到查询到的返回值 print(ret) #更新文件 # [{'backend':'www.oldboy1.org','record':{'server':'101.1000.7.9','weight':20,'maxconn':30}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.7','weight':213,'maxconn':720}}]