12-文件的增删改查【考验逻辑!!!】

要求:完成对haproxy.conf文件的增删改查----->本文只实现查询修改【其余异曲同工】

#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 500000ms
        timeout server 500000ms
        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 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30
        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333
        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 333333333333

简要介绍:

(1)查询

假设用户输入:www.oldboy1.org,我能够在文件中找到backend www.oldboy1.org,且打印下面所有的server,但是之后的不需要(比如:backend www.oldboy2.org......不需要)

(2)新增(添加)

要求用户输入一个字典的格式(有backend,有server对应的字典)。输入字典之前,需要先检索这条字典中的backend是否存在,若存在,就找要添加记录的server是否存在,若都存在,就不添加

(3)删除

与添加类似

(4)修改

用户也输入一个字典的格式(有backend,有server对应的字典)。用新的字典取代老的字典。同样要判断需要修改的内容是否存在。

----分割线ヾ(✿゚▽゚)ノヾ(✿゚▽゚)ノヾ(✿゚▽゚)ノ

【小知识点:利用tag状态,控制流程 True False】

(1)3级层的实现

while True:
    print('level1')
    choice=input('level1>>:').strip()
    while True:
        print('level2')
        choice = input('level2>>:').strip()
        while True:
            print('level3')
            choice = input('level3>>:').strip()

#此时--->显示:陷入死循环

level1
level1>>:dw
level2
level2>>:vw
level3
level3>>:csdf
level3
level3>>:dq
level3
level3>>:qw
level3
level3>>:

(2)想实现每级的跳出

while True:
    print('level1')
    choice=input('level1>>:').strip()
    if choice == 'quit': break
    while True:
        print('level2')
        choice = input('level2>>:').strip()
        if choice == 'quit': break
        while True:
            print('level3')
            choice = input('level3>>:').strip()
            if choice == 'quit': break

#此时--->显示:可以实现每层跳出,但是麻烦

level1
level1>>:qew
level2
level2>>:ewf
level3
level3>>:wef
level3
level3>>:quit
level2
level2>>:quit
level1
level1>>:quit

(3)现在输一个(比如quit_all)就退出所有循环------>利用tag状态进行判断

tag=True
while tag:
    print('level1')
    choice=input('level1>>:').strip()
    if choice == 'quit_all': tag = False
    while tag:
        print('level2')
        choice = input('level2>>:').strip()
        if choice == 'quit_all': tag = False
        while tag:
            print('level3')
            choice = input('level3>>:').strip()
            if choice == 'quit_all': tag = False

#此时--->显示:可以从第三层直接跳出

level1
level1>>:asd
level2
level2>>:da
level3
level3>>:adf
level3
level3>>:quit_all

----分割线ヾ(✿゚▽゚)ノヾ(✿゚▽゚)ノヾ(✿゚▽゚)ノ

版本一:复杂

import os
def fetch(data):#查询
    print('\033[1;43m这是查询功能\033[0m')  #\033[1;43m     \033[0m 对输出的字符进行修饰
    print('\033[1;43m用户输入数据是:{}\033[0m'.format(data))
    backend_data='backend {}'.format(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 read_line.startswith('backend'):  #这是为了防止下一个backend的输出
                break
            if tag:
                print(read_line,end='')  #end=''就是把\n去除
                ret.append(read_line)
    return ret  #返回查询结果
#注:fetch()查询功能,可能在别的地方被调用,比如:删除【删除之前就需要查询】,所以需要将fetch()的结果存储到列表中,进行返回

def add():  #增加
    print('这是增加功能')
    pass

#修改的小例子
#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}}]
#data[0]第一个字典,需要修改的记录:{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':20,'maxconn':3000}}
#data[1]第二个字典,修改之后的记录:{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}}
def change(data): #修改
    print('\033[1;43m这是修改功能\033[0m')
    print('\033[1;43m用户输入数据是:{}\033[0m'.format(data))
    backend=data[0]['backend'] #要修改的记录,文件中的一条记录  www.oldboy1.org
    backend_data='backend {}'.format(backend) #backend www.oldboy1.org
    old_sever_record='{}server {} {} weight {} maxconn {}\n'.format(' '*8, data[0]['record']['server'],
                                                                      data[0]['record']['server'],
                                                                      data[0]['record']['weight'],
                                                                      data[0]['record']['maxconn'])
    new_server_record='{}server {} {} weight {} maxconn {}\n'.format(' ' * 8, data[1]['record']['server'],
                                                                    data[1]['record']['server'],
                                                                    data[1]['record']['weight'],
                                                                    data[1]['record']['maxconn'])
    res=fetch(backend)
    print('来自change函数--->{}'.format(res))
    if not res or old_sever_record not in res:  #若返回的记录是空,backend记录或者server记录 不存在
        return '你要修改的记录不存在'
    else:  #进行修改操作
        index=res.index(old_sever_record)  #找到索引
        res[index]=new_server_record  #此时res里面存放的是修改后的结果
        print('列表中的值已经修改')
    #此时修改的是列表,但是要求对文件操作,只能读一个文件,再写入一个新的文件。
    #文件处理
    res.insert(0,'{}\n'.format(backend_data))
    with open('haproxy.conf','r')as read_f, open('haproxy_new.conf','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
    #对文件进行改名称
    os.rename('haproxy.conf','haproxy.conf.bak')
    os.rename('haproxy_new.conf','haproxy.conf')
    os.remove('haproxy.conf.bak')
    os.remove('haproxy_new.conf')

def delete(): #删除
    print('这是删除功能')
    pass

if __name__ == '__main__':
    msg='''1:查询\n2:添加\n3:修改\n4:删除\n5:退出'''
    msg_dict={'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)  # 将data由字符串转换为字典,除了查找,其余的输入都是字典格式
        res=msg_dict[choice](data)
        print(res)

查询结果显示:

1:查询
2:添加
3:修改
4:删除
5:退出
请输入你的选项:1
请输入你的数据:www.oldboy1.org
这是查询功能
用户输入数据是:www.oldboy1.org
        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30
        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333
        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

['        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30\n', '        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333\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']
1:查询
2:添加
3:修改
4:删除
5:退出
请输入你的选项:5

修改结果显示:

1:查询
2:添加
3:修改
4:删除
5:退出
请输入你的选项:3
请输入你的数据:[{'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}}]
这是修改功能
用户输入数据是:[{'record': {'weight': 20, 'maxconn': 3000, 'server': '2.2.2.4'}, 'backend': 'www.oldboy1.org'}, {'record': {'weight': 30, 'maxconn': 4000, 'server': '2.2.2.5'}, 'backend': 'www.oldboy1.org'}]
这是查询功能
用户输入数据是:www.oldboy1.org
        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30
        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333
        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

来自change函数--->['        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30\n', '        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333\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']
列表中的值已经修改
None
1:查询
2:添加
3:修改
4:删除
5:退出
请输入你的选项:5

且此时haproxy.conf的参数确实发生变化:

backend www.oldboy1.org
        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30
        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333
        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

版本二:简洁

【把相同的操作存放到一个函数中,减少代码量】

注:此时采用的是haproxy.conf的文件是原始文件(即本文开头的文件),不是修改后的文件。

import os

def file_handler(backend_data,type='fetch',res=None):
    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 read_line.startswith('backend'):  #这是为了防止下一个backend的输出
                    break
                if tag:
                    print(read_line,end='')  #end=''就是把\n去除
                    ret.append(read_line)
        return ret
    elif type=='change':
        with open('haproxy.conf', 'r')as read_f, open('haproxy_new.conf', '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
        # 对文件进行改名称
        os.rename('haproxy.conf', 'haproxy.conf.bak')
        os.rename('haproxy_new.conf', 'haproxy.conf')
        os.remove('haproxy.conf.bak')



def fetch(data):#查询
    print('\033[1;43m这是查询功能\033[0m')  #\033[1;43m     \033[0m 对输出的字符进行修饰
    print('\033[1;43m用户输入数据是:{}\033[0m'.format(data))
    backend_data='backend {}'.format(data)
    return file_handler(backend_data)#返回查询结果
#注:fetch()查询功能,可能在别的地方被调用,比如:删除【删除之前就需要查询】,所以需要将fetch()的结果存储到列表中,进行返回

def add():  #增加
    print('这是增加功能')
    pass

#修改的小例子
#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}}]
#data[0]第一个字典,需要修改的记录:{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':20,'maxconn':3000}}
#data[1]第二个字典,修改之后的记录:{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}}
def change(data): #修改
    print('\033[1;43m这是修改功能\033[0m')
    print('\033[1;43m用户输入数据是:{}\033[0m'.format(data))
    backend=data[0]['backend'] #要修改的记录,文件中的一条记录  www.oldboy1.org
    backend_data='backend {}'.format(backend) #backend www.oldboy1.org
    old_sever_record='{}server {} {} weight {} maxconn {}\n'.format(' '*8, data[0]['record']['server'],
                                                                      data[0]['record']['server'],
                                                                      data[0]['record']['weight'],
                                                                      data[0]['record']['maxconn'])
    new_server_record='{}server {} {} weight {} maxconn {}\n'.format(' ' * 8, data[1]['record']['server'],
                                                                    data[1]['record']['server'],
                                                                    data[1]['record']['weight'],
                                                                    data[1]['record']['maxconn'])
    res=fetch(backend)
    print('来自change函数--->{}'.format(res))
    if not res or old_sever_record not in res:  #若返回的记录是空,backend记录或者server记录 不存在
        return '你要修改的记录不存在'
    else:  #进行修改操作
        index=res.index(old_sever_record)  #找到索引
        res[index]=new_server_record  #此时res里面存放的是修改后的结果
        print('列表中的值已经修改')
    #此时修改的是列表,但是要求对文件操作,只能读一个文件,再写入一个新的文件。
    #文件处理
    res.insert(0,'{}\n'.format(backend_data))
    file_handler(backend_data,type='change',res=res)

def delete(): #删除
    print('这是删除功能')
    pass

if __name__ == '__main__':
    msg='''1:查询\n2:添加\n3:修改\n4:删除\n5:退出'''
    msg_dict={'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)  # 将data由字符串转换为字典,除了查找,其余的输入都是字典格式
        res=msg_dict[choice](data)
        print(res)

查询结果显示:

1:查询
2:添加
3:修改
4:删除
5:退出
请输入你的选项:1
请输入你的数据:www.oldboy1.org
这是查询功能
用户输入数据是:www.oldboy1.org
        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30
        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333
        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

['        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30\n', '        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333\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']
1:查询
2:添加
3:修改
4:删除
5:退出
请输入你的选项:5

修改结果显示:

1:查询
2:添加
3:修改
4:删除
5:退出
请输入你的选项:3
请输入你的数据:[{'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': {'maxconn': 3000, 'server': '2.2.2.4', 'weight': 20}}, {'backend': 'www.oldboy1.org', 'record': {'maxconn': 4000, 'server': '2.2.2.5', 'weight': 30}}]
这是查询功能
用户输入数据是:www.oldboy1.org
        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30
        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333
        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

来自change函数--->['        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30\n', '        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333\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']
列表中的值已经修改
None
1:查询
2:添加
3:修改
4:删除
5:退出
请输入你的选项:5

且此时haproxy.conf的参数确实发生变化:

backend www.oldboy1.org
        server 100.1000.7.9 100.1000.7.9 weight 20 maxconn 30
        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 333333333333
        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

注:版本二就是程序的解耦

PS:关于解耦的介绍,网上百度如下:

依赖·耦合:在面向对象编程中,对象自身是内聚的,是保管好自己的数据,完成好自己的操作的,而对外界呈现出自己的状态和行为。但是,没有绝对的自力更生,对外开放也是必要的!一个对象,往往需要跟其他对象打交道,既包括获知其他对象的状态,也包括仰赖其他对象的行为,而一旦这样的事情发生时,我们便称该对象依赖于另一对象。只要两个对象之间存在一方依赖一方的关系,那么我们就称这两个对象之间存在耦合。 比如妈妈和baby,妈妈要随时关注baby的睡、醒、困、哭、尿等等状态,baby则要仰赖妈妈的喂奶、哄睡、换纸尿裤等行为,从程序的意义上说,二者互相依赖,因此也存在耦合。首先要说,耦合是必要的。我们来看以下这个实验。(链接:https://www.zhihu.com/question/20821697/answer/102234360)

总结:

需要掌握:函数、文件处理、tag的用法、程序的解耦

转载于:https://my.oschina.net/pansy0425/blog/2992888

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值