设为首页 收藏本站
查看: 664|回复: 0

[经验分享] python 第三天 编写文件查询、添加、删除

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-16 09:54:30 | 显示全部楼层 |阅读模式
需求如下:

输出:
    1、获取ha记录
    2、增加ha记录
    3、删除ha记录
num = raw_input('请输入操作序号:')
如果用户输入的 1:
    read = raw_input('请输入backend:')     如输入:www.oldboy.org
    讲配置文件 backend www.oldboy.org 节点下的所有记录获取到,并输入到终端
如果用户输入的 2:
    read = raw_input('请输入要新加的记录:') 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
    # 讲read字符串转换成 字典类型
    read_dict = json.loads(read)
    backend_title = read_dict['backend']
    # 去配置文件中找到指定的节点:
    # backend test.oldboy.org
    # 如果已经存在,
        # 则在此节点下添加根据用输入构造出的记录,例如:
            server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
    # 如果不存在,
        # 则添加backend节点和记录,例如:
    backend test.oldboy.org
        server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
    # (可选)可以再对节点下记录进行判断是否已经存在
如果用户输入的 3:
    read = raw_input('请输入要删除的记录:') 如: {"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
    # 讲read字符串转换成 字典类型
    read_dict = json.loads(read)
    backend_title = read_dict['backend']
    #去配置文件中找到指定的节点,并在删除指定记录,如:
    backend test.oldboy.org
         server 100.1.7.10 100.1.7.10 weight 20 maxconn 3000
         server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000   # 删除掉
    # (可选)如果backend下所有的记录都已经被删除,那么将当前 backend test.oldboy.org 也删除掉。

思路如下:

文件处理:
1、查询、、、、判断用户输入,查询关键字,判断是否存在关键字符串,存在打印,不存在则输出
2、增加、、、、判断是否存在backend字段:
    1、存在则判断是否存在要添加字段,存在无动作,不存在则添加。
    2、判断是否存在要添加的记录,存在无动作,不存在则添加。
3、删除、、、、定位到删除的backend关键字
    1、找到相应记录,然后删除,判断删除后此backend字段是否为空,为空则删除backend字段。

代码实现如下:
# -*- coding: utf-8 -*-
__author__ = 'weibinf'
import json  #导入模块
import os  #导入模块
def cat():
    read = raw_input("\033[31m请输入backend: \033[0m").strip()
    strr = "backend" + " " + read  #取得输入字段
    obj = open("ha",'r')   #打开方式
    i = 0
    for item in obj:  #取得字段是否存在
        if strr.strip() == item.replace("\n",'').strip():
            i += 1
    if i > 0: #不为0
        exitt = False
        obj.seek(0) #从文件开头重新读取
        while not exitt:  #循环读取
            line = obj.readline().strip() #去掉本行中的空格
            if strr.strip() == line.replace("\n",'').strip(): #判断查询字符串和本行字符串是否相等
                print "\033[34m -\033[0m" * 30
                print "\033[34m %s \033[0m"%line
                obj.seek(obj.tell())
                while not exitt:
                    line = obj.readline()
                    if "backend" in line:#判断本行是否包含backend字段
                        exitt = True   #包含则退出
                    else:
                        print "\033[34m %s \033[0m"%line
    else:
        print  "\033[31m                   你输入的字符串不在文本中。。。 \033[0m"   #不存在打印


def edit():
    read = raw_input("\033[31m请输入要新加的记录: \033[0m").strip()   #获取输入字符串
    read_dict = json.loads(read)  #转换成字典
    backend_title = read_dict['backend']   #取出key值
    strr = "backend" + " " + str(backend_title)  #取出字符串
    strr1 = " " * 8 + "server" + " " + str(read_dict['record']['server']) + " " + str(read_dict['record']['server']) + " " + "weight" + " " + str(read_dict['record']['weight']) + " " + "maxconn" + " " + str(read_dict['record']['maxconn'])
    with open("ha",'r') as obj , open("haha",'a+') as obj2: #打开两个文件
        i = 0
        for item in obj:
            if strr.strip() == item.replace("\n",'').strip():   #判断字段是否存在
                i += 1
        qa = obj.tell()
        if i == 0:   #不存在则重新写入到文件
            obj.seek(0)
            while True:
                line = obj.readline()
                aa = obj.tell()
                if qa == aa:
                    obj2.write(line)
                    obj2.write("\n")
                    obj2.write('%s\n'%strr)
                    obj2.write('%s\n'%strr1)
                    obj2.flush()
                    break
                else:
                    obj2.write(line)
        elif i == 1:  #字段存在
            exitt = False
            obj.seek(0)
            while not exitt:
                line = obj.readline()
                obj2.write(line)
                bb = obj.tell()
                if strr.strip() == line.replace("\n",'').strip(): #判断字符串和本行是否相等
                    obj.seek(bb)
                    while not exitt:
                        line = obj.readline()
                        cc = obj.tell()
                        if strr1.replace("\n",'').replace(" ",'').strip() != line.replace("\n",'').replace(" ",'').strip(): #字符串和本行是否相等
                            if "backend" in line:  #本行包含backend关键字
                                num = obj.tell() - len(line) - 1
                                obj2.seek(num)
                                obj2.write('%s\n'%strr1)
                                obj2.write(line)
                                obj.flush()
                            elif qa == cc:   #判断文件是否已经是结尾
                                    obj2.write(line)
                                    obj2.write('%s\n'%strr1)
                                    obj.flush()
                                    exitt = True
                            else:   #其余结果
                                obj2.write(line)
                                obj2.flush()
    os.rename("ha","ha.bak")   #重新命名文件
    os.rename("haha","ha")


def dele():
    read = raw_input("\033[31m请输入要删除的记录: \033[0m").strip()
    read_dict = json.loads(read)
    backend_title = read_dict['backend']
    strr = "backend" + " " + str(backend_title)
    strr1 = " " * 8 + "server" + " " + str(read_dict['record']['server']) + " " + str(read_dict['record']['server']) + " " + "weight" + " " + str(read_dict['record']['weight']) + " " + "maxconn" + " " + str(read_dict['record']['maxconn'])
    with open("ha",'r+') as obj , open("hadel",'a+') as obj2: #打开两个文件
        i = 0
        for item in obj:
            if strr.strip() == item.replace("\n",'').strip():  #判断文件中是否包含关键字符串
                i += 1
        qa = obj.tell()
        if i == 0:
            print "\033[31m你输入的记录不存在。。。 \033[0m"  #不存在输出
        elif i == 1: #存在关键字符串
            exitt = False  #设置全局关键退出字段
            obj.seek(0)  #回到文件开头
            while not exitt:
                line = obj.readline()
                bb = obj.tell()
                if strr.strip() != line.replace("\n",'').strip(): #字符串和本行是否相等
                    obj2.write(line)
                    obj2.flush()
                else:
                    if qa == bb : #是否是文件结尾
                        obj2.write(line)
                        exitt = True
                    else:
                        xs = line
                        while not exitt:
                            line = obj.readline()
                            bb = obj.tell()
                            if strr1.replace("\n",'').replace(" ",'').strip() != line.replace("\n",'').replace(" ",'').strip() : #本行和关键字符串不相等
                                if qa == bb:
                                    obj2.write(line)
                                    exitt = True
                                elif "backend" in line: #本行包含关键字
                                    obj2.write(line)
                                    obj2.flush()
                                else:
                                    obj2.write(xs)
                                    obj2.write(line)
                                    obj2.flush()
                            else:
                                continue
    os.rename("ha","hadel.bak")
    os.rename("hadel","ha")


if __name__ == '__main__':
    print """\033[31m
        1、获取ha记录
        2、增加ha记录
        3、删除ha记录
        \033[0m"""
    while True:
        num = raw_input("\033[31m请输入相应编号:\033[0m").strip()
        if num == "1":
            cat()
        elif num == "2":
            edit()
        elif num == "3":
            dele()
        else:
            break

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-139763-1-1.html 上篇帖子: python小练习之换零钱 下篇帖子: python基础总结(函数,文件操作) python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表