• python——文件查询、修改操作练习


    def file_handle(backend_data,res = None,type = 'fetch'):
        if type == 'fetch':
            ret = []
            with open('haproxy','r')  as read_f :
                tag = False
    
                for read_line in read_f:
                    if read_line.strip() == backend_data:
                        tag = True
                        continue
    
                    if tag and read_line.startswith('backend'):
                        break                               #server读完,读到下一个backend时,关闭for循环,否则就会将 backend www.oldboy1.org后面的内容全部读出来
    
                    if tag :
                        print('33[1;45m%s33[0m'%read_line,end = '')      #把读到的哪一行server打印出来
                        ret.append(read_line)                       #将满足条件的哪一行server添加到列表中
            return ret                                    #函数返回该列表,及返回查询结果
    
        elif type == 'change':
            import os
            with open ('haproxy','r') as read_f, open('haproxy_new','w') as write_f:
                tag = False
                has_write = False                                 #设置has_write 阀门 是为了防止每一次server都运行一遍 for record in res: 如果这样,新文件中就会有四条修改过的backend www.oldboy1.org的相关内容
    
                for read_line in read_f:
                    if read_line.strip() == backend_data:
                        tag = True
                        continue
                    if tag and read_line.startswith('backend'):
                        tag = False                     #如果此处不对tag进行关闭,那么在新文件中写完backend www.oldboy1.org内的server就会停止
    
                    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','haproxy.bak')              #此三步操作是使新文件覆盖老文件,先将老文件换名,再将新文件换成老文件原来的名,在删除老文件
            os.rename('haproxy_new','haproxy')
            os.remove('haproxy.bak')
    
    
    
    
    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)
        backend = data[0]['backend']                      #文件当中的一条记录 如 www.oldboy1.org
        backend_data = 'backend %s' %backend
        old_server_record = '%sserver %s weight %s maxconn %s
    ' % (' '*8,data[0]['record']['server'],data[0]['record']['weight'],data[0]['record']['maxconn']) #因为传进来的参数是列表(内包含两个字典),通过此语句将要修改的数据拼接成完整的字符串
        new_server_record = '%sserver %s weight %s maxconn %s
    ' % (' '*8,data[1]['record']['server'],data[1]['record']['weight'],data[1]['record']['maxconn'])
        print('用户想要修改的记录是',old_server_record)
        res = fetch(backend)                           #获取backend 后的server内容
        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
    ' %backend_data)                 #此处不能用append,因为调用此方法会将 backend_data 数据,将其添加到开头,因此应用insert方法添加到列表末尾,此语句的作用是避免新文件没有backend...,因为在此之前,res的列表种不包含backend...
        file_handle(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)
        print('最终的结果是',res)
    
    # 修改信息:[{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4 2.2.2.4','weight':20,'maxconn':3000}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5 2.2.2.5','weight':30,'maxconn':4000}}]

        总结:(1)练习函数的编程

        (2)文件的处理

        (3)解耦:把查询功能和修改功能的部分代码移动到file_handle() 函数中,这就可以看作是程序的解耦

        (4)tag的用法:程序中tag和has_write的用法,使函数在适当的时候停止,注意看在函数中 tag 的用法

  • 相关阅读:
    PHP基本的语法以及和Java的差别
    Linux 性能測试工具
    【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)
    【Oracle 集群】Oracle 11G RAC教程之集群安装(七)
    【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
    Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
  • 原文地址:https://www.cnblogs.com/jgua/p/13619521.html
Copyright © 2020-2023  润新知