2018-06-24-Python全栈开发day21-part1-文件的增删改查

#上课的时候咩有听太懂,模糊再学习一边

原文件

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

目的:1.对制定标题进行查询,并且找到标题下的所有内容

    2.对制定条目进行修改为特定内容

      

# [{'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}}]

-----没头绪ing

import os
def fetch(data):
    backend_data = 'backend %s' % data  # 拼接用户需要查找的数据
    with open('xxx', 'r') as f:
        tag = False
        ret = []
        for i in f:  # 逐行阅读数据
            if i.strip() == backend_data:  # 这个时候找到了用户需要查询数据的开头
                tag = True
                continue
            if tag and i.startswith('backend'):  # 当阅读到下一个backend的时候,停止
                break
            if tag:
                print(i)
                ret.append(i)
    return ret


def change(data):
    backend = data[0]['backend']  # 从用户输入的数据中,选择关键字网址
    backend_data = 'backend %s' % backend  # 将网址进行拼接,然后就可以调用查询功能
    # [{'backend':'www.oldboy1.org','record':{'server':'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'])

    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('用户想要修改的数据是%s' % old_server_record)
    res = fetch(backend)
    if not res or old_server_record not in res:
        return '你要修改的数据不存在'
    else:
        index = res.index(old_server_record)
        res[index] = new_server_record  # 思路:找到想要修改的数据,如果在里面,后续完成文件写入,如果不在,就break
        # 其实已经告诉哪些需要改,然后改成什么样子
    # 接下来就是写入数据
    with open('xxx', 'r') as f, open('xxx_new', 'w') as f_new:
        has_write = False
        tag = False
        for i in f:
            if i.strip() == backend_data:  # 这个时候找到了用户需要查询数据的开头
                tag = True
                continue
            if tag and i.startswith('backend'):  # 当阅读到下一个backend的时候,停止
                tag = False
            if not tag:
                f_new.write(i)
            else:
                if not has_write:
                    for i in res:
                        f_new.write(i)
                    has_write = True  # 第一次写入完了之后,下一次遍历就不再写入
    os.rename('xxx','xxx.bak')
    os.rename('xxx_new','xxx')


def add():
    pass


def delete():
    pass


# 先让用户选择要使用的功能
msg = '1:查询,2:修改,3:添加,4:删除,5:退出'  # 告诉用户有哪几种选择
msg_dict = {
    '1': fetch,
    '2': change,
    '3': add,
    '4': delete
}
while True:
    print(msg)
    chioce = input('请输出你的选择:').strip()
    if not chioce:
        continue  # 如果用户没有输入数据,跳过
    if chioce == '5':
        break  # 输入5,就结束
    data = input('请输入你想选择的数据').strip()  # 让用户输入需要选择数据
    if chioce != '1':
        data = eval(data)
    # 肯定要根据用户输入的选择,来选择函数
    res = msg_dict[chioce](data)  # 根据用户的选择,来确定选择的函数,并且能返回用户需要的数值
    print('最终的结果', res)

其实查询的功能很简单,就是对于输入的一个网址,然后加上backend进行拼接,然后逐行进行对比,如果对比成功,那么从这一行开始,逐行放到一个列表中,当再次读到backend的时候,结束放入列表,然后输出列表,这个列表的内容就是需要查询的内容。

对于修改来说

其实题目中很明确,已经通过列表的方式,在列表内放入两个字典,然后一个是原数据,一个是修改后的数据,

自己需要做的:

1.对原数据进行查询,是否在文本中,如果在的话再进行修改,如果不在就break

2.查询到在文本中之后,提取出查询到的内容,然后对特定值进行替换,得到替换之后的内容ret

3.对文件进行逐行读取,读取到查询到的内容时,开始写入ret,再次读取到backend的时候,写入原来的内容。

 

posted @ 2018-06-24 22:10  brownbearye  阅读(125)  评论(0)    收藏  举报