使用Python解析macro.ini

本文介绍了一种使用Python解析MML配置文件的方法。通过定义MML类并利用正则表达式来提取MOC对象及其命令、属性等信息,并将这些信息组织成字典结构。此外,还提供了比较两个MML文件差异的功能,最终将比较结果输出到文本文件中。

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

#使用Python解析macro.ini
# -*- coding: utf-8 -*-
import os
import re

class MML:
    def __init__(self, FilePath):
        print FilePath
        if os.path.exists(FilePath) == False:
            self.create = False
        else:
            self.create = True
            self.fp = open(FilePath)

        #用于保存MOC对象的命令和属性,MOCdir = { 'MOCname':{'CMD':{attr:[obj,obj.attr]}}}
        self.MOCdir = {}
        self.Level = 4
        #当前读取的MOC对象名称
        self.CurrentMOC = ''
        #当前读取操作是:ADD/MOD/RMV
        self.CurrentOperator = ''
        #当前读取的属性
        self.CurrentAttr = ''
        #当前读取的是否为命令内容
        self.ContentFlag = False
        #读取MML文件
        self.ReadMML()
        #for key in self.MOCdir.keys():
            #self.PrintMOC(key)



    def isCreate(self):
        return self.create
    #读取MML文件
    def ReadMML(self):
        while True:
            line = self.fp.readline()
            if line:
                self.ReadLine(line)
            else:
                break
        self.fp.close()

    #读取一行MML文件内容
    def ReadLine(self, content):
        #获取MOC及命令
        if self.GetCMD(content) == True:
            return 0                
        if self.ContentFlag == False:
            return 0
        #跳过空行
        if len(content) < 3:
            return 0       
        #获取属性名称
        if self.GetCMDAttr(content) == False:
            return
        #获取属性联想对象
        self.GetAttrAssociation()


    #获取MOC及命令
    def GetCMD(self, content):
        if re.search('\[.*\]',content):
            ContentFlag = False
            #获取MOC名称
            #'\[ *(?P<opName>[^ ]*) (?P<MOCName>[^ ]*) *\]'去除可能存在的多余空格
            match = re.search('\[ *(?P<opName>[^ ]*) +(?P<MOCName>[^ ]*) *\]', content)
            if match:
                MOCName = match.group('MOCName')
                opName = match.group('opName')
                #增加MOC对象和命令
                if MOCName in self.MOCdir.keys():
                    self.MOCdir[MOCName][opName] = {}
                else:
                    self.MOCdir[MOCName] = {opName:{}}
                
                #当前读取的MOC和命令
                self.CurrentMOC = MOCName
                self.CurrentOperator = opName
                #标识下一行是数据
                self.ContentFlag = True
                return True
            return False

    #匹配属性名称       
    def GetCMDAttr(self, content):
        match =  re.search(' *[0-9]+ *=(?P<attrName>.*)', content)
        if match :
            result = match.group('attrName')
            result = result.replace(' ', '')
            #增加MOC对象命令的属性
            self.CurrentAttr = result
            self.MOCdir[self.CurrentMOC][self.CurrentOperator][self.CurrentAttr] = []
            return True
        else:
            print 'no match attrName'
            return False

    #读取属性联想的对象和属性
    def GetAttrAssociation(self):
        for i in range(2):
            line = self.fp.readline()
            #名字只包含字符数字,下划线和减号
            match = re.search('.*= *(?P<moc>[\w,_, -]*)', line)
            if match:
                self.MOCdir[self.CurrentMOC][self.CurrentOperator][self.CurrentAttr].append(match.group('moc'))

    #比较新旧MML文件,DiffDict 格式:{'ADD/MOD/RMV':{'MOCname':{'ADD/MOD/RMV':{'CMD': {'ADD/MOD/RMV':{atr:[obj,obj.attr]}}}}}}
    def CompareMML(self, oldMOC):
        #用于保存新旧文件比较结果
        DiffDict = {}
        #新旧对比
        self.iteCompareMML(self.MOCdir, oldMOC.MOCdir, 4, DiffDict)
        #由DiffDict中删除没有改变的项
        self.DelNoModify(DiffDict,4)
        #输出比较结果
        self.WriteDiffToFile(DiffDict)


    #递归比较MOC差异
    def iteCompareMML(self, new1, old, Level, DiffDict):
        if Level <= 0:
            return
        if Level == 1:
            #保存新旧联想对象和属性
            DiffDict['old'] = old
            DiffDict['new'] = new1
            return 0
        
        DiffDict['ADD'] = {}
        DiffDict['RMV'] = {}
        DiffDict['MOD'] = {}
        #判断新增或修改
        for key in new1.keys():
            if key in old.keys():
                #可能修改的
                DiffDict['MOD'][key] = {}
            else:
                DiffDict['ADD'][key] = new1[key]
        #判断为删除项
        for key in old.keys():
            if key not in new1.keys():            
                DiffDict['RMV'][key] = old[key]
        #继续判断是否有修改
        for key in DiffDict['MOD'].keys():
            self.iteCompareMML(new1[key], old[key], Level - 1, DiffDict['MOD'][key])
        


    def PrintMOC(self,MOCName):
        if MOCName in self.MOCdir.keys():
            print 'MOC Name: %s'%MOCName
            for cmd in self.MOCdir[MOCName]:
                print '%s %s'%(cmd, MOCName)
                for attr in self.MOCdir[MOCName][cmd]:
                    print 'attr: %s'%attr
                    print 'associate MOC: %s\nassociate attr: %s'%(self.MOCdir[MOCName][cmd][attr][0], self.MOCdir[MOCName][cmd][attr][1])

    #删除没有修改的项
    def DelNoModify(self, DiffDict, Level):
        if Level < 2:
            return

        for cmd in DiffDict.keys():
            #删除没有增加,或修改的命令
            if len(DiffDict[cmd]) == 0 and Level > 1:
                del DiffDict[cmd]
            #递归查找下一级    
            elif len(DiffDict[cmd]) != 0 and Level > 2 and cmd == 'MOD':
                for key in DiffDict[cmd].keys():
                    self.DelNoModify(DiffDict[cmd][key], Level - 1)
            #判断属性的联想是否修改        
            elif len(DiffDict[cmd]) != 0 and Level == 2 and cmd == 'MOD':
                for attr in DiffDict[cmd].keys():
                    AttrDict = DiffDict[cmd][attr]
                    if AttrDict['old'][0] == AttrDict['new'][0] and AttrDict['old'][1] == AttrDict['new'][1]:
                        del AttrDict
                                    
    #输出比较结果到result.txt   
    def WriteDiffToFile(self, DiffDict):
        fp = open('result.txt','w')
        
        if 'ADD' in DiffDict.keys() and len(DiffDict['ADD']) > 0:
            fp.write('================================================================\n')
            fp.write('新增MML命令联想\n')
            self.WriteNeworRmvToFile(DiffDict, 'ADD', fp)
            fp.write('================================================================\n')
            fp.write('\n\n')
            
        if 'RMV' in DiffDict.keys() and len(DiffDict['RMV']) > 0:
            fp.write('================================================================\n')
            fp.write('删除MML命令联想\n')
            self.WriteNeworRmvToFile(DiffDict, 'RMV', fp)
            fp.write('\n\n')
            fp.write('================================================================\n')

        if 'MOD' in DiffDict.keys() and len(DiffDict['MOD']) > 0:
            fp.write('================================================================\n')
            fp.write('修改MML命令属性联想\n')
            self.WriteModToFile(DiffDict, fp)
            fp.write('\n\n')
            fp.write('================================================================\n')
            
        fp.close()

    #写入新增命或删除命令到result.txt
    def WriteNeworRmvToFile(self, DiffDict, op, fp):        
        #打印新增或删除的MOC的所有命令
        for obj in DiffDict[op].keys():
            moc = DiffDict[op][obj]
            for cmd in moc.keys():
                CMDName = '%s %s\n'%(cmd,obj)
                fp.write(CMDName)
                
        #判断是否有修改命令的MOC
        if 'MOD' not in DiffDict.keys():
            return 0
              
        #打印已有MOC新增或删除的命令
        for obj in DiffDict['MOD'].keys():
            if op not in DiffDict['MOD'][obj]:
                continue
            moc = DiffDict['MOD'][obj][op]
            for cmd in moc.keys():
                CMDName = '%s %s\n'%(cmd,obj)
                fp.write(CMDName)

    #把修改的MOC命令写到result.txt
    def WriteModToFile(self, DiffDict, fp):
        for obj in DiffDict['MOD'].keys():
            #可能修改的命令
            moc = DiffDict['MOD'][obj]['MOD']
            for cmd in moc.keys():
                if self.CmdIsMod(moc[cmd]) != True:
                    continue
                CMDName = '%s %s\n'%(cmd,obj)
                fp.write(CMDName)
                self.WriteCMDModtoFile(moc[cmd], fp)
                
    #把增加,修改,或删除的属性及联想对象写的result.txt
    def WriteCMDModtoFile(self, CMDDict, fp):
        for op in CMDDict.keys():
            if len(CMDDict[op]) < 0:
                continue
            
            if op == 'ADD':
                fp.write('新增MML参数联想\n')
                for attr in CMDDict[op].keys():
                    AttrList = CMDDict[op][attr]
                    msgStr = u'%s \n联想对象为: %s 联想属性为:%s\n'%(attr, AttrList[0], AttrList[1])
                    msgStr += '\n'
                    fp.write(msgStr.encode('utf-8'))

            if op == 'RMV':
                fp.write('删除MML参数联想\n')
                for attr in CMDDict[op]:
                    msgStr = '%s\n'%attr
                    msgStr += '\n'
                    fp.write(msgStr)
              
            if op == 'MOD':
                if self.AttrIsMod(CMDDict[op]) == True:
                    fp.write('修改MML参数联想\n')
                else:
                    continue
                
                for attr in CMDDict[op]:
                    AttrDict = CMDDict[op][attr]
                    if AttrDict['new'][0] != AttrDict['old'][0] or AttrDict['new'][1] != AttrDict['old'][1]:
                        msgStr = '%s\n'%attr
                    else:
                        continue
                    if AttrDict['new'][0] != AttrDict['old'][0]:
                        msgStr += u'联想对象由 %s 改为 %s\n'%(AttrDict['old'][0],AttrDict['new'][0])
                    if AttrDict['new'][1] != AttrDict['old'][1]:
                        msgStr += u'联想属性由 %s 改为 %s\n'%(AttrDict['old'][1],AttrDict['new'][1])
                    msgStr += '\n'
                    fp.write(msgStr.encode('utf-8'))

    #判断命令属性是否修改
    def AttrIsMod(self, AttrDict):
        for attr in AttrDict.keys():
            if AttrDict[attr]['new'][0] != AttrDict[attr]['old'][0] or AttrDict[attr]['new'][1] != AttrDict[attr]['old'][1]:
                return True
        return False
    
    #判断命令是否修改
    def CmdIsMod(self, cmd):
        if 'ADD' in cmd.keys() and len(cmd['ADD']) > 0:
            return True
        if 'RMV' in cmd.keys() and len(cmd['RMV']) > 0:
            return True
        if self.AttrIsMod(cmd['MOD']) == True:
            return True
        return False
            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值