一、eval函数复习:
a=[{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':20,'maxconn':3000}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}}] print(type(a)) b={'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':20,'maxconn':3000}} # print(type(b)) c=[{'sdf':123,'ddd':'afdaf'}] # print(type(c)) d='[1,2,3]' print(type(d))
二、insert函数 的复习:
p=[123,'xyz'] p.insert(0,'abc') print(p)
三、write函数的复习:
filename = 'pragramming.txt' with open(filename,'w') as fileobject: #使用‘w’来提醒python用写入的方式打开 fileobject.write('I love your name!' '\nI love your cloth!' '\nI love your shoes!' '\nI love your hair!') # 这种操作绝不会改动文件名的!!!! with open(filename,'a') as fileobject: #使用‘a’来提醒python用附加模式的方式打开 fileobject.write('\nI an superman.')
四、查询功能:
1.题目:haproxy.conf文件内容如下:
global
log 127.0.0.1 local2
daemon
maxconn 256
log 127.0.0.1 local2 info
defaults
log global
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option dontlognull
listen stats :8888
stats enable
stats uri /admin
stats auth admin:1234
frontend oldboy.org
bind 0.0.0.0:80
option httplog
option httpclose
option forwardfor
log global
acl www hdr_reg(host) -i www.oldboy.org
use_backend www.oldboy.org if www
backend www.oldboy1.org
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.4 2.2.2.4 weight 20 maxconn 3000
backend www.oldboy2.org
server 3.3.3.3 3.3.3.3 weight 20 maxconn 3000
backend www.oldboy20.org
server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333
2.查询功能要求与代码:
# 题目要求: # 对于查询,输入backend 后面 的网址,就查出来server相关的内容 # 对于修改,必须是查到的情况下进行修改操作,如果没有查询到,修改个P # 修改要求:将haproxy中的backend www.oldboy1.org下面的server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000 # 改成:server 2.2.2.5 2.2.2.5 weight 30 maxconn 4000 def fetch(data): #因为是查询功能,所以必须需要调用一个参数 # print('\033[1;43m这是查询功能\033[0m') # print('\033[1;43m用户输入的数据是\033[0m',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 continue if tag and read_line.startswith('backend'): break #后面有return,因此这里先放一个break if tag: #这时,tag为ture状态 print('\033[1;45m%s\033[0m'%read_line,end='') ret.append(read_line) if not tag: #这时,tag还是原来的false,这时只是做了一个for循环遍历了每一行而已 pass return ret def add(): pass def change(data): # print('这个是修改功能') # print('用户输入的数据是',data) # data[0] #文件当中的一条记录 backend=data[0]['backend'] #它就是:www.oldboy1.org backend_data='backend %s'%backend #它就是:bankend www.oldboy1.org # 注释:[{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':20,'maxconn':3000}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}}] # server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000 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']) 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']) print('用户想要修改的记录是',old_server_record) res=fetch(backend) print('来自change函数——》',res) if not res: #表示res是空列表,即用户输入的内容在文件中找不到,找不到,则不能修改! return '修改记录不存在' if old_server_record not in res: #表示如果虽然找到了www.oldboy1.org,但是对应的下方的serve内容不存在,同样不能修改! return '修改记录不存在' #需要判断我找到的要修改的记录是不是在我的列表里面 else: #这时,完成修改操作 index=res.index(old_server_record) # data有两个值,data[0]是我要改的值,data[1]是我要修改成的值 res[index]=new_server_record # print('列表中的值已经修改') #因为文件操作的时候如果修改则会将原来的东西全部删除创建新的, # 所以for循环将原来没有改得值重新插入新文件中,得到修改过的文件 res.insert(0,'%s\n'%backend_data) with open('haproxy.conf','r') as read_f,\ open('haproxy.conf_new','w') as write_f: tag=False tag2=False for read_line in read_f: #server #write_f.write(read_line) #这里相当于把haproxy里面的内容读一行复制给write_f,读一行复制给write_f if read_line.strip()==backend_data: tag=True #警报拉响! continue if tag and read_line.startswith('backend'): tag=False if tag: if not tag2: for record in res: #当警报拉响的时候,我就直接向新文件里面写列表(res)的内容即可。 write_f.write(record) tag2=True if not tag: write_f.write(read_line) 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','weight':20,'maxconn':3000}}, # 改成{'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':20,'maxconn':3000}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}}]
3.查询功能的part1的test.py
# while True: # print('level') # choice=input('level1>>: ').strip() # if choice=='quit':break #表示退出当前层 # while True: # print('level2') # choice = input('level2>>: ').strip() # if choice == 'quit': break #表示退出当前层,返回上一层level1 # while True: # print('level3') # choice = input('level3>>: ').strip() # if choice == 'quit': break # # tag=True # while True: # print('level') # choice=input('level1>>: ').strip() # if choice=='quit':break #表示退出当前层 # while True: # print('level2') # choice = input('level2>>: ').strip() # if choice == 'quit': break #表示退出当前层,返回上一层level1 # while True: # print('level3') # choice = input('level3>>: ').strip() # if choice == 'quit': break # if choice=='quit_all':tag=False #这样的话,不管是哪一层,输入quit_all就会全部结束 # # a=[1,2,3,4,5] # b=['asx','sdf','asda','alex','wupeiqi'] # print(a.index(3)) # print(b.index('asda')) # # index()的作用:显示对象的索引位置 res=[' server 101.1000.7.9 101.1000.7.9 weight 20 maxconn 30\n', ' server 2.2.2.7 2.2.2.7 weight 30 maxconn 4000\n', ' server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000\n', ' server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000\n', '\n'] data=[{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':20,'maxconn':3000}},{'backend':'www.oldboy1.org','record':{'server':'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']) index=res.index(old_server_record) print(index)
4.修改功能的相关图片:
5.程序的解耦(基于查询功能的代码进行)
#在上个例子中,fetch()和change()里面的with open...下面的一坨都是在做文件处理功能。 #那么我就会想能不能将这个文件处理功能封装成一个函数 #从而这个程序和之前的程序效果是一样的,但是可读性更强! def file_handle(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 continue if tag and read_line.startswith('backend'): break #后面有return,因此这里先放一个break if tag: #这时,tag为ture状态 print('\033[1;45m%s\033[0m'%read_line,end='') ret.append(read_line) if not tag: #这时,tag还是原来的false,这时只是做了一个for循环遍历了每一行而已 pass return ret elif type == 'change': with open('haproxy.conf', 'r') as read_f, \ open('haproxy.conf_new', 'w') as write_f: tag = False tag2 = False for read_line in read_f: # server # write_f.write(read_line) #这里相当于把haproxy里面的内容读一行复制给write_f,读一行复制给write_f if read_line.strip() == backend_data: tag = True # 警报拉响! continue if tag and read_line.startswith('backend'): tag = False if tag: if not tag2: for record in res: # 当警报拉响的时候,我就直接向新文件里面写列表(res)的内容即可。 write_f.write(record) tag2 = True if not tag: write_f.write(read_line) 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) # data[0] #文件当中的一条记录 backend=data[0]['backend'] #它就是:www.oldboy1.org backend_data='backend %s'%backend #它就是:bankend www.oldboy1.org # 注释:[{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':20,'maxconn':3000}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}}] # server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000 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']) 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']) print('用户想要修改的记录是',old_server_record) res=fetch(backend) #就是fetch(www.oldboy1.org) print('来自change函数——》',res) if not res: #表示res是空列表,即用户输入的内容在文件中找不到,找不到,则不能修改! return '修改记录不存在' if old_server_record not in res: #表示如果虽然找到了www.oldboy1.org,但是对应的下方的serve内容不存在,同样不能修改! return '修改记录不存在' #需要判断我找到的要修改的记录是不是在我的列表里面 else: #这时,完成修改操作 index=res.index(old_server_record) # data有两个值,data[0]是我要改的值,data[1]是我要修改成的值 res[index]=new_server_record # print('列表中的值已经修改') #因为文件操作的时候如果修改则会将原来的东西全部删除创建新的, # 所以for循环将原来没有改得值重新插入新文件中,得到修改过的文件 res.insert(0,'%s\n'%backend_data) file_handle(backend_data,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)