圣诞节的整理前两周的内容4

一、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!'
                     '
I love your cloth!'
                     '
I love your shoes!'
                     '
I love your hair!')
# 这种操作绝不会改动文件名的!!!!

with open(filename,'a') as fileobject: #使用‘a’来提醒python用附加模式的方式打开
    fileobject.write('
I 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('33[1;43m这是查询功能33[0m')
    # print('33[1;43m用户输入的数据是33[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('33[1;45m%s33[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
'%(' '*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
' % (' ' * 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
'%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
', '        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
', '
']
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
'%(' '*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('33[1;45m%s33[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('33[1;43m这是查询功能33[0m')
    # print('33[1;43m用户输入的数据是33[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
'%(' '*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
' % (' ' * 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
'%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)



原文地址:https://www.cnblogs.com/lijialun/p/10174606.html