# -*- 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