21python学习 time与random等常用模块与包 查询修改功能 程序解耦

#对文件进行更改或者查询功能
import os
#把文件处理弄个一个函数
def file_handler(backend_data,res=None,type='fetch'):  #需要处理的数据是查找数据,或者是要修改前后数据backend www ,
                                                   # res 是查询或者修改的列表 change有   处理的方式默认查询
    if type == 'fetch':     #先判断功能是否查找功能
        with open('haproxy.conf','r') as read_f:    #对'haproxy.conf'文件只读模式,获取句柄
            tag=False
            ret=[]
            for read_line in read_f:   #一行一行地取出进行for循环  注意第一个backend和第二个backend的判断和输出问题
                if read_line.strip() == backend_data:      #strip() 是去除首尾的空格和回车,strip('*')指定去除*
                    tag=True                  #找到那一行了,tag赋值,为后边判断是否已经找到给提示,
                                               # 当在read_line是在serve的时候可以知道已经找到了
                    continue             #本次循环结束,继续到下一个for的循环,这样做不会导致下边的程序受影响吗???????
                if tag and read_line.startswith('backend'):    #tag==True 当已经找到了需要的那一行,
                         # 然后read_line.startswith('backend')是需要找到在下一个backend停止的位置;
                         # 如果循环输出时候,输出后开头找到有backend开头的,则可以停止打印,使得输出为backend之间的serve,不会有多余输出
                        # tag=False     #没必要了
                        break            #这个if只能放中间要在下一个if之前,否则会多打印出下一个www.oldboy2.org
                if tag:
                    print('\033[1;45m%s\033[0m' %read_line,end='') #打印 serve ;
                    # 如果文件中内容找到了与输入相同的那一行,输出那一行(不包括那一行)之后的全部内容
                    ret.append(read_line)        #加到ret内
        return ret  #返回取得的serve  以列表形式  ,return的位置与文件处理那一列对应
    elif type == 'change':
        with open('haproxy.conf', 'r') as read_f, \
                open('haproxy.conf_new', 'w') as write_f: #只读形式打开文件并获取句柄,
            # 并且新建一个文件只写形式把修改后的放到这个文件下之后再完全覆盖原文件。  \是换行意思,
            tag = False
            has_write = False  #是否写入过
            for read_line in read_f:  # server
                if read_line.strip() == backend_data:   #找到了要修改的位置
                    tag = True
                    continue        #找到了第一个更改的backend位置,并且记录,直接执行下一个for循环,
                                    # 找到后才做修改,防止修改错了
                if tag and read_line.startswith('backend'):  #找到第一个backend和第二个backend之间的数据serve,给tag=False标记
                    tag = False        #
                if not tag:#配合上一个if ,tag=Fales时候,即找到backend之间的数据,则把自己取出来的数据又自己写回去,
                                      # 相当于不变(可能第几行会变,但是内容不变)
                    write_f.write(read_line)   #read_line局部变量,当没有到要修改的地方和修改完成之后,此时的tag=False,
                                                # 其实是相当于把原文件的内容写到新建的文件中
                else:      #如果tag=Ture 的时候
                    if not has_write:          #要判断是否已经写入过了,因为下一行那个for是将把要修改的内容全部写到新文件中,
                                   # 而在原文件那个大的for循环里面两个backend之间的serve要一行一行地进行判断 tag标志是一个一个的,
                                            # 如果没有判断,则会变成每个serve就全部写入一次
                        for record in res:    # res 是查询或者修改的列表 ,把要修改的内容全部写到新文件中
                            write_f.write(record)
                        has_write = True
        os.rename('haproxy.conf', 'haproxy.conf.bak')  #为了防止待会重名先改名字
        os.rename('haproxy.conf_new', 'haproxy.conf')  #把修改好了的性文件重命名为原文件名字完成覆盖
        os.remove('haproxy.conf.bak')     #把源文件删除

#查询文件haroxy.conf内是否有backend www.oldboy1.org,如果有则输出他下边对应的serve
def fetch(data):
    # print('\033[1;43m这是查询功能\033[0m')
    # print('\033[1;43m用户数据是\033[0m',data)
    backend_data='backend %s' %data      #data是要查找的数据,但是没有backend这个字眼,但是文件那一行中有,要加上去,
                            # 要记得这里文件处理是一行一行地处理的,如果不加上backend就不能匹配到了
    return file_handler(backend_data)   #直接返回这个函数的结构


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
    #       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'])
    #  这个是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}}]
    new_server_record = '%sserver %s %s weight %s maxconn %s\n' % (' ' * 8, data[1]['record']['server'],  #注意\n要写上去啊
                                                                 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 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)     #要在开头添加\n
    file_handler(backend_data,res=res,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)      #******执行msg_dic字符串对应choice下对应的函数,
                                    # 将要处理的数据data传送过给函数去执行,得到返回值
        print('最终结果是--》',res)   #注意
# 运行change函数时候输入  第一个字典是被修改的,要改成第二个字典的内容
#这个是更改前后输入的数据 [{'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}}]
# 要掌握的知识点
# 1函数
# 2文件处理
# 3tag的用法
# 4程序的解耦

 module模块和包的介绍

http://www.cnblogs.com/yuanchenqi/articles/5732581.html  中有总结

猜你喜欢

转载自blog.csdn.net/yunyupianlan/article/details/81073212