智能变电站SCD文件解析&虚端子软压板&增加描述信息

本文介绍如何利用Python解析智能变电站的SCD文件,详细探讨了获取虚端子和软压板信息的过程,并提及通过解析Excel文件来得到全局连接矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值