python解析智能变电站SCD文件,获取虚端子和软压板信息。
from lxml import etree
import xlwt
import os
import time
import sys
def gainNS(filename):
# 首先获取xml文件的命名空间
currentDir = os.getcwd()
ns = ''
absDir = currentDir + '\\' + filename
with open(absDir, 'r', encoding='utf-8') as f:
# print('正在获取命名空间...')
for i in range(100): # 读取前十行
line = f.readline()
items = line.split() # 以空格分割
for i in items:
if 'xmlns=' in i:
ns = i.split('"')[-2]
break
ns = '{' + ns + '}'
# print('命名空间获取成功:' + ns)
return ns
def removeNull(str): #去除identify中的null,已经用不到了
if 'null' in str:
return ''.join(str.split('null'))
else:
return str
def gainID(x): #寻找LN节点的三个属性值组成ID
try:
res=x.get('prefix','') + x.get('lnClass','') + x.get('inst','' )
except Exception:
print('未知错误', "逻辑节点:" +str(x))
return res
def addIEDdesc(string,dictionary): #给IED名字添加描述信息
name=string.split('.')[0]
desc=dictionary[name]
res=string.replace(name,name+'.'+desc)
return res
def gainStrapsAndVT(filename):
ns=gainNS(filename)
tree=etree.parse(filename)
root=tree.getroot()
IEDs=root.findall(ns+'IED') #找到所有的IED节点
print("IED总数:"+str(len(IEDs)))
IEDandDesc={
} #字典
for i in IEDs:
IEDandDesc[i.get('name')]=i.get('desc')
# print('字典长度为:'+str(len(IEDandDesc)))
if len(IEDs)!=len(IEDandDesc):
print('在给IED名字添加描述信息时出错,请检查字典长度。')
worbook = xlwt.Workbook()
sheet1 = worbook.add_sheet('VT', cell_overwrite_ok=True)
sheet2 = worbook.add_sheet('strap', cell_overwrite_ok=True)
i = 0 #对虚端子计数
j = 0 #对软压板计数
print("正在读取虚端子和软压板...")
for ied in IEDs:
iedName=ied.get('name') #获取当前IED的名字
links=ied.iter(ns+'ExtRef') #找到每条链路
for item in links:
intAddr = iedName+'.'+item.get('intAddr').split(':')[-1]#增加了IED名字属性
identifyLN=item.get('intAddr').split('/')[-1].split('.')[0] # intAddr里面的LN值可以唯一确定对应LDevice下的LN节点
identifyLD=item.get('intAddr').split(':')[-1].split('/')[0] #从intAddr里解析出逻辑设备名
identifyDO=item.get('intAddr').split('.')[1] #从intAddr里解析出数据对象名
# LDevice=item.find('.......') #先寻找当前LN0的父节点LDevice