python对文件进行增,删,改,查

# -*- coding: UTF-8 -*-
'''
Created on 2016年7月14日
@author: zhanglw
'''
import json


''' 查询 '''
def selectByCaption(caption):
    
    with open('log','r') as fileObj: #只读方式打开文件
        store = []   #存放查询到的数据
        flag = False #标识位默认false
        
        for line in fileObj: #循环文件内容
            if line.strip() == 'caption %s' % caption: #匹配指定的行 结束本次循环,开始下一行的截取工作
                flag = True  #一旦遇到了指定的标题行 就意味着准备读取了
                continue
            
            if flag and line.startswith('caption'): #如果遇到了下一个标题行 就 证明匹配到的节点没有下文了, 那么就 结束循环,
                break
            
            if flag and line.strip(): #将匹配到的节点的下文追加到列表中,一行作为列表的一个元素
                store.append(line.strip())
            
    return store #返回列表


''' 保存,更新 '''
def saveORupdateCaption(record):
    '''
    record 传递进来的字典
    {'caption': 'caption window.test1', 'record': {'memory_limit': 99, 'cpu_limit': 99, 'disk_limit': 99, 'server': '255.255.255.255'}}
    '''
    #获取标题    caption window.test1
    caption_ = record.get('caption')
    
    #获取记录内容并拼接记录字符串
    record_ = record.get('record')
    values_ = (record_.get('server'), record_.get('cpu_limit'), record_.get('memory_limit'), record_.get('disk_limit'))
    
    #拼接后的内容:server:192.168.139.104 cpu_limit:88 memory_limit:99 disk_limit:77
    content_ = 'server:%s cpu_limit:%d memory_limit:%d disk_limit:%d' % values_
    
    #从  'caption window.test1' 中截取出 window.test1
    captionVal = caption_.split(" ")[1]
    #调用查询方法 获取标题下的内容,得到一个列表
    old_content = selectByCaption(captionVal)
    
    #列表中有值,代表存在,没值代表不存在
    #不存在的时候-----------保存
    if len(old_content) == 0:
        with open('log','r') as old_file, open('log_new','w') as new_file: #同时打开2个文件,老文件读,新文件写
            for line in old_file: #循环复制
                new_file.write(line)
            
            new_file.write('\n' + caption_+ '\n')    #不存在 直接保存 先保存标题 caption window.test1
            new_file.write(' '*4 + content_ + '\n')  #再保存标题下的内容,拼接的字符串content_
            
    #存在的时候-----------更新
    else:
        serverVal = 'server:'+values_[0]; #拼接字符串:server:192.168.139.104
        temp = False  #用来决定更新或添加
        for serverV in old_content:
            if serverV.startswith(serverVal): #只要找到了就决定了是该更新,然后跳出循环
                temp = True
                break
            
        if temp:
            print '记录已存在,替换'
            old_content.remove(serverV)       #移除存在的记录
            old_content.append(content_+'\n') #插入新的记录  即使他们的值一模一样 我们也更新,即使不一致,挨个去修改也费劲
            print old_content
        else:
            old_content.append(content_+'\n') #不存在,直接插入
        
        flag = False
        has_write= False #防止重复写入标题内容
        with open('log','r') as old_file, open('log_new','w') as new_file: #同时打开2个文件,老文件读,新文件写
            for line in old_file: #循环老文件
                if line.strip() == caption_: #判断是否为要插入的标题,是就只写入标题,然后进行下次循环
                    flag = True #标识找到了要插入的标题
                    new_file.write(line)
                    continue
                
                if flag and line.startswith('caption'): #又遇到了caption行,证明要插入的标题的原有内容行已经循环完毕
                    flag = False
                    
                if flag: #找到了要插入的标题后,开始写入我们组装的标题内容
                    if not has_write:
                        print '进来了-----'
                        for f in old_content:
                            new_file.write(' '*4 + f+'\n')
                        has_write = True
                else: #写入其他标题以及下面的内容
                    new_file.write(line)


''' 删除 '''
def deleteCaption(record, isAll):
    #获取标题
    caption_ = record.get('caption')
    
    #用空格分割 "caption window.test1",获取的是window.test1
    #通过查询方法,获取标题原来的节点内容
    old_content = selectByCaption(caption_.split(" ")[1])
    
    #标题不存在的时候
    if len(old_content) == 0:
        print '要删除的节点不存在:',caption_
        #然后直接复制一份
        with open('log','r') as old_file, open('log_new','w') as new_file:
            for line in old_file:
                new_file.write(line)
        
    #标题存在的时候    
    else:
        flag = False
        with open('log','r') as old_file, open('log_new','w') as new_file:
            if isAll:  #isAll==True 就删除标题以及节点内容, 实现上就是遇到该标题就跳过它和它下的所有节点内容
                for line in old_file:
                    #遇到标题所在的行,不复制
                    if line.strip() == caption_:
                        flag = True
                        continue
                    #遇到标题所在的行,他下面的内容也不复制
                    if flag and not line.strip().startswith('caption'):
                        flag = True
                        continue
                    
                    #当遇到其他标题,flag置为false,这样下面的代码判断才会赋值
                    if line.strip().startswith('caption'):
                        flag = False
                        
                    #遇到 不是所给标题的标题行以及下面的内容 才复制
                    if not flag:
                        new_file.write(line)
                       
            else: #isAll==False 就删除标题下的节点内容
                values_ = record.get('record').get('server')
                server_new = 'server:'+values_; #server:192.168.139.135
                
                temp = False
                for server_ in old_content:
                    if server_.startswith(server_new): #循环该标题下所有的节点,找出server,找到了就跳出循环
                        temp = True #为true 说明要删除的节点存在
                        break
                    
                if temp: #存在就移出掉
                    old_content.remove(server_)
                    
                    flag = False
                    has_write= False
                    for line in old_file:
                        if line.strip() == caption_:
                            flag = True
                            new_file.write(line)
                            continue
                    
                        if flag and line.startswith('caption'):
                            flag = False
                            
                        if flag:
                            if not has_write:
                                for f in old_content:
                                    new_file.write(' '*4 + f+'\n')
                                has_write = True
                        else:
                            new_file.write(line)
                else: #否则就提示要删除的节点不存在
                    print '要删除的节点内容不存在'
                    #然后直接复制一份
                    with open('log','r') as old_file, open('log_new','w') as new_file:
                        for line in old_file:
                            new_file.write(line)
                    
if __name__ == '__main__':
    
#     param = 'window.test'
#     store = selectByCaption(param)
#     print '\n'.join(store)

    record = '{"caption":"caption window.test1","record":{"server":"335.255.255.255","cpu_limit":99,"memory_limit":99,"disk_limit":99}}'
    dict_1 = json.loads(record) #将json串转为字典
    
#     saveORupdateCaption(dict_1)

    deleteCaption(dict_1,False)

    

log文件的内容如下:

caption window.operation
        server:192.168.139.101 cpu_limit:80 memory_limit:85 disk_limit:85
server:192.168.139.102 cpu_limit:80 memory_limit:80 disk_limit:80
server:192.168.139.103 cpu_limit:80 memory_limit:80 disk_limit:80
server:192.168.139.104 cpu_limit:88 memory_limit:99 disk_limit:77

caption window.develop
server:192.168.139.131 cpu_limit:90 memory_limit:85 disk_limit:90
server:192.168.139.132 cpu_limit:90 memory_limit:80 disk_limit:80

caption window.test
server:192.168.139.135 cpu_limit:80 memory_limit:89 disk_limit:95
server:255.255.255.255 cpu_limit:100 memory_limit:100 disk_limit:100
server:255.255.255.333 cpu_limit:100 memory_limit:100 disk_limit:100

caption window.test1
server:192.168.139.135 cpu_limit:80 memory_limit:89 disk_limit:95
server:255.255.255.255 cpu_limit:100 memory_limit:100 disk_limit:100

    
    

你可能感兴趣的:(python)