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 的用法

原文地址:https://www.cnblogs.com/jgua/p/13619521.html