【菜鸟零基础学习笔记】Day-21-查询和修改文件、函数的解耦

一个可以直接退出三层循环的小技巧:

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

有一个叫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.5 2.2.2.5 weight 30 maxconn 4000

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


为这个文件编写查询功能:

def fetch(data):
    print('\033[1;43m这是查询功能!\033[0m')   #这里的颜色在我的pycharm里显示不出来,为什么???
    print('\033[1;43m用户数据是\033[0m',data)
    backend_data='backend %s\n' %data   #如果这里不加上\n的话,在下面加上strip()也是可以的
    with open('haproxy.conf','r') as read_f:
        tag=False
        ret = []
        for read_line in read_f:
            if read_line == backend_data:   #read_line.strip()可以去掉一句话后面的回车。strip默认是用来去除字符串首尾的空格和回车的,也可以用来去除指定的符号
                tag=True   #警报拉响,下一行数据需要输出
                continue  #直接进入下一次循环
            if tag:   #写成if tag and read_line.startswith('backend'):break也可以
                if read_line.startswith('backend'):   #在tag已经等于True的基础上判断是否开头为backend
                    # tag=False  #没必要改成False
                    break
            if tag:
                print(read_line,end='') #end=''会使该函数关闭“在输出中自动包含换行”的默认行为
                ret.append(read_line)
    return ret

def add():
    pass

def change():
    pass

def delete():
    pass

if __name__ =='__main__' :
    msg='''
    1:查询
    2:添加
    3:修改
    4:删除
    5:退出
    '''
    msg_dic={
        '1':fetch,
        '2':add,
        '3':change,
        '4':delete,
        '5':exit
    }
    while True:
        print(msg)
        choice=input('请输入你的选项:').strip()
        if not choice:continue    #choice自带布尔值,如果是空的话,则返回False
        if choice == '5':break

        data = input('请输入你的数据').strip()
        res = msg_dic[choice](data)
        print(res)

补充:eval函数的作用:

print(type(eval('[1,2,3,4]')))  #<class 'list'>
print(type(eval('1+3')))  #<class 'int'>
print(type(eval('abc')))  #报错(eval不能用于字符串)

为这个文件编写修改功能:

import os
def fetch(data):
    # print('\033[1;43m这是查询功能!\033[0m')   #这里的颜色在我的pycharm里显示不出来,为什么???
    # print('\033[1;43m用户数据是\033[0m',data)
    backend_data='backend %s\n' %data   #如果这里不加上\n的话,在下面加上strip()也是可以的
    with open('haproxy.conf','r') as read_f:
        tag=False
        ret = []
        for read_line in read_f:
            if read_line == backend_data:   #read_line.strip()可以去掉一句话后面的回车。strip默认是用来去除字符串首尾的空格和回车的,也可以用来去除指定的符号
                tag=True   #警报拉响,下一行数据需要输出
                continue  #直接进入下一次循环
            if tag:   #写成if tag and read_line.startswith('backend'):break也可以
                if read_line.startswith('backend'):   #在tag已经等于True的基础上判断是否开头为backend
                    # tag=False  #没必要改成False
                    break
            if tag:
                print(read_line,end='') #end=''会使该函数关闭“在输出中自动包含换行”的默认行为
                ret.append(read_line)
    return ret

def add():
    pass

def change(data):
    # print('这是修改功能')
    # print('用户输入的数据是:',data)
    backend=data[0]['backend'] #文件当中的一条记录 www.oldboy1.org
    backend_data='backend %s' %backend  #backend www.oldboy1.org
    #把用户输入的data拼接成文档中的格式
    old_server_record='%sserver %s %s weight %s maxconn %s\n' %(' '*8,data[0]['record']['server'],    #不要忘了\n
                                                              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 or old_server_record not in res:   #如果返回一个空列表或用户想找的数据不在数据集内
        return '你要修改的记录不存在'
    else:
        index=res.index(old_server_record)  # 找到这条记录在列表中的索引
        res[index]=new_server_record
        print('列表中值已修改')
    #接下去开始文件处理(文件没有修改一说,只有写一个新文件,删除旧文件)
    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
        has_written=False
        for read_line in read_f:
            if read_line.strip() == backend_data:
                tag=True  #拉响警报
                continue
            if tag and read_line.startswith('backend'):   #关闭警报(注意tag=True条件一定要加上)
                tag = False
            if not tag:
                write_f.write(read_line)
            else:
                if not has_written:
                    for record in res:
                        write_f.write(record)
                    has_written=True
    os.rename('haproxy.conf','haproxy.conf.bak')  #把叫haproxy.conf的文件的名字改成haproxy.conf.bak
    os.rename('haproxy.conf_new', 'haproxy.conf')
    os.remove('haproxy.conf.bak')


def delete():
    pass

if __name__ =='__main__' :
    msg='''
    1:查询
    2:添加
    3:修改
    4:删除
    5:退出
    '''
    msg_dic={
        '1':fetch,
        '2':add,
        '3':change,
        '4':delete,
        '5':exit
    }
    while True:
        print(msg)
        choice=input('请输入你的选项:').strip()
        if not choice:continue    #choice自带布尔值,如果是空的话,则返回False
        if choice == '5':break

        data = input('请输入你的数据').strip()  #注意:即使输入的是列表,input接收的也是字符串
        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}}]


当输入以下代码的时候,可以正常运行
[{'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}}]

(应该就是有无回车的问题)

程序的解耦

import os
def fetch(data):
    # print('\033[1;43m这是查询功能!\033[0m')   #这里的颜色在我的pycharm里显示不出来,为什么???
    # print('\033[1;43m用户数据是\033[0m',data)
    backend_data='backend %s\n' %data   #如果这里不加上\n的话,在下面加上strip()也是可以的
    with open('haproxy.conf','r') as read_f:
        tag=False
        ret = []
        for read_line in read_f:
            if read_line == backend_data:   #read_line.strip()可以去掉一句话后面的回车。strip默认是用来去除字符串首尾的空格和回车的,也可以用来去除指定的符号
                tag=True   #警报拉响,下一行数据需要输出
                continue  #直接进入下一次循环
            if tag:   #写成if tag and read_line.startswith('backend'):break也可以
                if read_line.startswith('backend'):   #在tag已经等于True的基础上判断是否开头为backend
                    # tag=False  #没必要改成False
                    break
            if tag:
                print(read_line,end='') #end=''会使该函数关闭“在输出中自动包含换行”的默认行为
                ret.append(read_line)
    return ret

def add():
    pass

def change(data):
    # print('这是修改功能')
    # print('用户输入的数据是:',data)
    backend=data[0]['backend'] #文件当中的一条记录 www.oldboy1.org
    backend_data='backend %s' %backend  #backend www.oldboy1.org
    #把用户输入的data拼接成文档中的格式
    old_server_record='%sserver %s %s weight %s maxconn %s\n' %(' '*8,data[0]['record']['server'],    #不要忘了\n
                                                              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 or old_server_record not in res:   #如果返回一个空列表或用户想找的数据不在数据集内
        return '你要修改的记录不存在'
    else:
        index=res.index(old_server_record)  # 找到这条记录在列表中的索引
        res[index]=new_server_record
        print('列表中值已修改')
    #接下去开始文件处理(文件没有修改一说,只有写一个新文件,删除旧文件)
    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
        has_written=False
        for read_line in read_f:
            if read_line.strip() == backend_data:
                tag=True  #拉响警报
                continue
            if tag and read_line.startswith('backend'):   #关闭警报(注意tag=True条件一定要加上)
                tag = False
            if not tag:
                write_f.write(read_line)
            else:
                if not has_written:
                    for record in res:
                        write_f.write(record)
                    has_written=True
    os.rename('haproxy.conf','haproxy.conf.bak')  #把叫haproxy.conf的文件的名字改成haproxy.conf.bak
    os.rename('haproxy.conf_new', 'haproxy.conf')
    os.remove('haproxy.conf.bak')


def delete():
    pass

if __name__ =='__main__' :
    msg='''
    1:查询
    2:添加
    3:修改
    4:删除
    5:退出
    '''
    msg_dic={
        '1':fetch,
        '2':add,
        '3':change,
        '4':delete,
        '5':exit
    }
    while True:
        print(msg)
        choice=input('请输入你的选项:').strip()
        if not choice:continue    #choice自带布尔值,如果是空的话,则返回False
        if choice == '5':break

        data = input('请输入你的数据').strip()  #注意:即使输入的是列表,input接收的也是字符串
        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}}]

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值