组态王 (KingView) 支持点表的导入导出,其格式为xml.
这种格式适合编程读写,但并不方便人工阅读.习惯用excel编写点表,于是,用python实现了将组态王的xml格式的点表转换为csv格式,可在excel中编辑,增删改查,然后再转换为xml格式,导回给组态王.
代码分2部分,分别为 xml-->csv 以及 csv-->xml
1 import os 2 import re 3 import tkinter as tk 4 from tkinter import filedialog 5 import datetime 6 # 读入组态王导出的点表文件 7 root = tk.Tk() 8 root.withdraw() 9 组态王导出的点表文件路径 = filedialog.askopenfilename() 10 组态王导出的点表文件路径 = 组态王导出的点表文件路径.replace('/',chr(92)) 11 输入文件 = open(组态王导出的点表文件路径,'r',encoding = "utf-16") 12 输入点表内容 = 输入文件.read() 13 输入文件.close() 14 布尔量标题栏 = '''变量名 变量类型 初始值 保存数值 保存参数 连接设备 地址 数据类型 读写属性 采集频率 允许DDE访问 报警组 优先级 开关量报警 报警类型 关文本 开文本 开关文本 关开文本 扩展区1 扩展区2 历史记录模式 每_分 生成事件 安全区 组路径 描述 数据签名 15 ''' 16 整数部分题栏 = '''变量名 变量类型 变化灵敏度 初始值 最小值 最大值 最小原始值 最大原始值 保存数值 保存参数 连接设备 寄存器 数据类型 读写属性 采集频率 转换方式 高级 查表 累计方式 累计最小值 累计最大值 允许DDE访问 报警组名 优先级 低低选 低低限 低低文 低选 低限 低文 高选 高限 高文 高高选 高高限 高高文 死区选 死区限 报警延迟选 报警延迟值 变化率选 变化率值 变化率单位 偏差值 小偏差选 小偏差值 大偏差选 大偏差值 死区选 死区值 扩展1 扩展2 记录方式 变化灵敏 定时间隔 生成事件 安全区 组路径 描述 数据签名 17 ''' 18 浮点数题栏 = '''变量名 变量类型 变化灵敏度 初始值 最小值 最大值 最小原始值 最大原始值 保存数值 保存参数 连接设备 寄存器 数据类型 读写属性 采集频率 转换方式 高级 查表 累计方式 累计最小值 累计最大值 允许DDE访问 报警组名 优先级 低低选 低低限 低低文 低选 低限 低文 高选 高限 高文 高高选 高高限 高高文 死区选 死区限 报警延迟选 报警延迟值 变化率选 变化率值 变化率单位 偏差值 小偏差选 小偏差值 大偏差选 大偏差值 死区选 死区值 扩展1 扩展2 记录方式 变化灵敏 定时间隔 生成事件 安全区 组路径 描述 数据签名 19 ''' 20 # 布尔量部分 21 文件内容 = "" 22 布尔量部分 = re.search(r'<IOBool TagNumber[\s\S]+?</IOBool>',输入点表内容) 23 if 布尔量部分: 24 布尔量部分 = 布尔量部分.group() 25 文件内容 = 布尔量标题栏 26 变量描述列表 = re.findall(r'<Tag VarName.+?/>',布尔量部分) 27 for 变量描述 in 变量描述列表: 28 单个变量参数列表 = re.findall(r'".*?"',变量描述) 29 for 单个变量参数 in 单个变量参数列表: 30 单个变量参数 = 单个变量参数.replace('"','') 31 文件内容 += 单个变量参数 + '\t' 32 文件内容 += '\n' 33 输出文件路径 = re.search(r'^.+\.',组态王导出的点表文件路径).group() 34 输出文件路径 = re.sub(r'\.$','_数字量_转换为电子表格' + datetime.datetime.now().strftime('%y_%m_%d_%H%M%S') + '.csv',输出文件路径) 35 输出文件 = open(输出文件路径,'w',encoding = "utf-16") 36 输出文件.write(文件内容) 37 输出文件.close() 38 # 整数部分 39 文件内容 = "" 40 整数部分 = re.search(r'<IOInt TagNumber[\s\S]+?</IOInt>',输入点表内容) 41 if 整数部分: 42 整数部分 = 整数部分.group() 43 文件内容 = 整数部分题栏 44 变量描述列表 = re.findall(r'<Tag VarName.+?/>',整数部分) 45 for 变量描述 in 变量描述列表: 46 单个变量参数列表 = re.findall(r'".*?"',变量描述) 47 for 单个变量参数 in 单个变量参数列表: 48 单个变量参数 = 单个变量参数.replace('"','') 49 文件内容 += 单个变量参数 + '\t' 50 文件内容 += '\n' 51 输出文件路径 = re.search(r'^.+\.',组态王导出的点表文件路径).group() 52 输出文件路径 = re.sub(r'\.$','_整数_转换为电子表格' + datetime.datetime.now().strftime('%y_%m_%d_%H%M%S') + '.csv',输出文件路径) 53 输出文件 = open(输出文件路径,'w',encoding = "utf-16") 54 输出文件.write(文件内容) 55 输出文件.close() 56 # 浮点数部分 57 文件内容 = "" 58 浮点数部分 = re.search(r'<IOFloat TagNumber[\s\S]+?</IOFloat>',输入点表内容) 59 if 浮点数部分: 60 浮点数部分 = 浮点数部分.group() 61 文件内容 = 布尔量标题栏 62 变量描述列表 = re.findall(r'<Tag VarName.+?/>',浮点数部分) 63 for 变量描述 in 变量描述列表: 64 单个变量参数列表 = re.findall(r'".*?"',变量描述) 65 for 单个变量参数 in 单个变量参数列表: 66 单个变量参数 = 单个变量参数.replace('"','') 67 文件内容 += 单个变量参数 + '\t' 68 文件内容 += '\n' 69 输出文件路径 = re.search(r'^.+\.',组态王导出的点表文件路径).group() 70 输出文件路径 = re.sub(r'\.$','_浮点数_转换为电子表格' + datetime.datetime.now().strftime('%y_%m_%d_%H%M%S') + '.csv',输出文件路径) 71 输出文件 = open(输出文件路径,'w',encoding = "utf-16") 72 输出文件.write(文件内容) 73 输出文件.close()
1 import os 2 import re 3 import tkinter as tk 4 from tkinter import filedialog 5 import datetime 6 # 读入准备反转为组态王点表的csv文件 7 8 root = tk.Tk() 9 root.withdraw() 10 组态王导出的点表文件路径 = filedialog.askopenfilename() 11 组态王导出的点表文件路径 = 组态王导出的点表文件路径.replace('/',chr(92)) 12 输入文件 = open(组态王导出的点表文件路径,'r',encoding = "utf-16") 13 # 读数据 14 数据列表 = [] 15 for 行文本 in 输入文件: 16 数据列表.append(行文本.replace('\n','').split('\t')) 17 输入文件.close() 18 19 文件头 = r'''<?xml version="1.0" encoding="UTF-16" standalone="yes"?> 20 <TagDefine Version="7.5"> 21 <BaseTag TagNumber="变量数目"> 22 ''' 23 文件尾 = ''' </BaseTag> 24 </TagDefine> 25 ''' 26 数字量变量标签样本 = '''<Tag VarName="D风4开水泵请求" TagType="IOBool" InitialValue="0" SaveData="N" SaveParameter="N" DeviceName="JEC" RegisterName="V2019.3" DataType="Bit" RWAttribute="读写" CollectFrequency="1000" DDEAccess="N" AlarmGroup="RootNode" Priority="1" AlarmEnabled="N" AlarmType="0" OffAlarmText="关" OnAlarmText="开" OnOffAlarmText="开到关" OffOnAlarmText="关到开" ExternField1="" ExternField2="" HistoryRecordWay="0" RecordInterval="0" ProduceOperateEvent="N" SecurityArea="无" GroupPath="" Comment="" TagSignature="-112"/>''' 27 整数变量标签样本 = '''<Tag VarName="J高温制冷模式统计" TagType="IOInt" ChangeSensitivity="0" InitialValue="0" MinValue="-999999999" MaxValue="999999999" MinOriginalValue="-999999999" MaxOriginalValue="999999999" SaveData="N" SaveParameter="N" DeviceName="JEC" RegisterName="V206" DataType="SHORT" RWAttribute="读写" CollectFrequency="1000" CovertWay="1" AdvanceConvertWay="0" NonLinearTableName="" AddUpWay="" MinAccumulateValue="" MaxAccumulateValue="" DDEAccess="N" AlarmGroup="RootNode" Priority="1" LoLoEnabled="N" LoLoLimit="0" LoLoAlarmText="低低" LoEnabled="N" LoLimit="0" LoAlarmText="低" HiEnabled="N" HiLimit="0" HiAlarmText="高" HiHiEnabled="N" HiHiLimit="0" HiHiAlarmText="高高" LimitDeadEnabled="N" LimitDeadZone="0" AlarmDelayEnabled="N" AlarmDelay="0" ChangeRateEnabled="N" ChangeRate="0" ChangeRateUnit="0" OffsetTargetValue="0" SmallOffsetEnabled="N" SmallOffset="0" BigOffsetEnabled="N" BigOffset="0" OffsetDeadZoneEnabled="N" OffsetDeadZone="0" ExternField1="" ExternField2="" HistoryRecordWay="0" HistoryRecordSensitivity="1" RecordInterval="0" ProduceOperateEvent="N" SecurityArea="无" GroupPath="" Comment="" TagSignature="-112"/>''' 28 浮点数变量标签样本 = '''<Tag VarName="YA吸气压力上限" TagType="IOFloat" ChangeSensitivity="0" InitialValue="0" MinValue="0" MaxValue="999999999" MinOriginalValue="0" MaxOriginalValue="999999999" SaveData="N" SaveParameter="N" DeviceName="压A" RegisterName="V520" DataType="FLOAT" RWAttribute="读写" CollectFrequency="1000" CovertWay="1" AdvanceConvertWay="0" NonLinearTableName="" AddUpWay="" MinAccumulateValue="" MaxAccumulateValue="" DDEAccess="N" AlarmGroup="RootNode" Priority="1" LoLoEnabled="N" LoLoLimit="0" LoLoAlarmText="低低" LoEnabled="N" LoLimit="0" LoAlarmText="低" HiEnabled="N" HiLimit="0" HiAlarmText="高" HiHiEnabled="N" HiHiLimit="0" HiHiAlarmText="高高" LimitDeadEnabled="N" LimitDeadZone="0" AlarmDelayEnabled="N" AlarmDelay="0" ChangeRateEnabled="N" ChangeRate="0" ChangeRateUnit="0" OffsetTargetValue="0" SmallOffsetEnabled="N" SmallOffset="0" BigOffsetEnabled="N" BigOffset="0" OffsetDeadZoneEnabled="N" OffsetDeadZone="0" ExternField1="" ExternField2="" HistoryRecordWay="2" HistoryRecordSensitivity="0" RecordInterval="1" ProduceOperateEvent="N" SecurityArea="无" GroupPath="" Comment="" TagSignature="-112"/>''' 29 # 提取数字量变量属性 30 数字量变量属性初步提取列表 = re.findall(r' .+?=',数字量变量标签样本) 31 数字量变量属性列表 = [] 32 for 属性 in 数字量变量属性初步提取列表: 33 数字量变量属性列表.append(属性.replace(' ','').replace('=','')) 34 # 提取整数变量属性 35 整数变量属性初步提取列表 = re.findall(r' .+?=',整数变量标签样本) 36 整数变量属性列表 = [] 37 for 属性 in 整数变量属性初步提取列表: 38 整数变量属性列表.append(属性.replace(' ','').replace('=','')) 39 # 提取浮点数变量属性 40 浮点数变量属性初步提取列表 = re.findall(r' .+?=',浮点数变量标签样本) 41 浮点数变量属性列表 = [] 42 for 属性 in 浮点数变量属性初步提取列表: 43 浮点数变量属性列表.append(属性.replace(' ','').replace('=','')) 44 正文部分 = '' 45 变量数量计数 = 0 46 del 数据列表[0] 47 变量类型 = 数据列表[0][1] 48 if 变量类型 == 'IOBool': 49 for 数据行 in 数据列表: 50 变量数量计数 += 1 51 正文部分 += r' <Tag' 52 属性指针 = 0 53 for 属性 in 数字量变量属性列表: 54 正文部分 += ' ' + 属性 + r'="' + 数据行[属性指针] + r'"' 55 属性指针 += 1 56 正文部分 += r'/>' +'\n' 57 正文头 = r' <IOBool TagNumber="' + str(变量数量计数) +r'">' + '\n' 58 正文尾 = r' </IOBool>' + '\n' 59 文件头 = 文件头.replace(r'变量数目',str(变量数量计数)) 60 文件内容 =文件头 + 正文头 + 正文部分 + 正文尾 + 文件尾 61 输出文件路径 = re.search(r'^.+\.',组态王导出的点表文件路径).group() 62 输出文件路径 = re.sub(r'\.$','_还原' + datetime.datetime.now().strftime('%y_%m_%d_%H%M%S') + '.xml',输出文件路径) 63 输出文件 = open(输出文件路径,'w',encoding = "utf-16") 64 输出文件.write(文件内容) 65 输出文件.close()
标签:点表,变量,文件,路径,excel,组态王,re,列表 From: https://www.cnblogs.com/jichao1515/p/16846188.html