zoukankan      html  css  js  c++  java
  • 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 的用法

  • 相关阅读:
    MVC应用程序使用Entity Framework
    @Styles的nameSpace是什么
    创建第一个MVC应用程序
    计算DataTable某列的值(SUM)
    DropDownList 控件的SelectedIndexChanged事件触发不了
    在类中使用Response.Redirect()方法
    控制某个panel的display样式
    获取指定日期下个月份的第一天
    字符串如何还原为中文
    判断字符串中包含3个连续(升、降)或相同的数字
  • 原文地址:https://www.cnblogs.com/jgua/p/13619521.html
Copyright © 2011-2022 走看看