Python解析xml寫入xlsx檔案
阿新 • • 發佈:2018-12-15
初次接觸Python實現的一個小功能。最初的版本全域性變數滿篇飛,簡直不忍直視,此處程式碼是後來重構過的,感覺還有好多優化的地方,以後有空再搞。
<metric> <complexity>61</complexity> <unit>TypeData</unit> <classification>untestable, very high risk</classification> <file>source\misc.c</file> <startLineNumber>139</startLineNumber> <endLineNumber>426</endLineNumber> <SLOC>287</SLOC> </metric> <metric> <complexity>49</complexity> <unit>urMinStat</unit> <classification>complex, high risk</classification> <file>mp\source\formance.c</file> <startLineNumber>1514</startLineNumber> <endLineNumber>1665</endLineNumber> <SLOC>151</SLOC> </metric>
# !/usr/bin/python # -*- coding: UTF-8 -*- import os import sys import xml.sax import xlsxwriter from collections import OrderedDict print 'Run:',sys.argv[0] filePath = sys.argv[1] os.chdir(filePath) pwd = os.getcwd() print pwd dictOutPut = {'Team':' ' ,'SumCcmValue':0.0 ,'averageCcmValue':0.0, 'veryHighRiskNum':0, 'highRiskNum':0, 'moderateRiskNum':0, 'muchRiskNum':0, 'ccmNum':0, 'funcNum':0, 'fileNum':0, 'codeNum':0, 'codeNumOver200':0, 'codeNumOver100':0, 'codeNumLess20':0, 'complexityOver10':0} xlsxTitle =['Team','SumCcmValue', 'veryHighRiskNum','highRiskNum', 'moderateRiskNum', 'muchRiskNum', 'funcNum', 'codeNum'] dictOutPut['Team'] = filePath.split("\\")[-1] ccmXlsxFileName = 'ccm_info.xlsx' monitorItems = OrderedDict() class CcmHandler(xml.sax.ContentHandler): def __init__(self): self.CurrentData = "" self.complexity = "" self.unit = "" self.classification = "" self.file = "" self.SLOC = "" def startElement(self, tag, attributes): self.CurrentData = tag def endElement(self, tag): if self.CurrentData == "complexity": dictOutPut['SumCcmValue'] = dictOutPut['SumCcmValue'] + int(self.complexity) if int(self.complexity) >= 10:dictOutPut['complexityOver10'] = dictOutPut['complexityOver10'] + 1 elif self.CurrentData == "classification": if self.classification == "untestable, very high risk": dictOutPut['veryHighRiskNum'] = dictOutPut['veryHighRiskNum'] + 1 elif self.classification == "complex, high risk": dictOutPut['highRiskNum'] = dictOutPut['highRiskNum'] + 1 elif self.classification == "more complex, moderate risk": dictOutPut['moderateRiskNum'] = dictOutPut['moderateRiskNum'] + 1 elif self.classification == "simple, without much risk": dictOutPut['muchRiskNum'] = dictOutPut['muchRiskNum'] + 1 elif self.CurrentData == "unit": dictOutPut['funcNum'] += 1 elif self.CurrentData == "file": dictOutPut['fileNum'] += 1 elif self.CurrentData == "SLOC": dictOutPut['codeNum'] = dictOutPut['codeNum'] + int(self.SLOC) if int(self.SLOC) > 200: dictOutPut['codeNumOver200'] = dictOutPut['codeNumOver200'] + 1 if int(self.SLOC) > 100: dictOutPut['codeNumOver100'] = dictOutPut['codeNumOver100'] + 1 if int(self.SLOC) < 20: dictOutPut['codeNumLess20'] = dictOutPut['codeNumLess20'] + 1 self.CurrentData = "" if dictOutPut['funcNum'] != 0: dictOutPut['averageCcmValue'] = dictOutPut['SumCcmValue'] / dictOutPut['funcNum'] def characters(self, content): if self.CurrentData == "complexity": self.complexity = content elif self.CurrentData == "classification": self.classification = content elif self.CurrentData == "file": self.file = content elif self.CurrentData == "SLOC": self.SLOC = content def writeXls(self): del_ccm_info_xlsx() add_ccm_info_xlsx() def add_ccm_info_xlsx(): row = col =0 workbook = xlsxwriter.Workbook(ccmXlsxFileName) worksheet = workbook.add_worksheet('ccm') for key in xlsxTitle: if dictOutPut.has_key(key) is not None: # python2用的是row.has_key(key) monitorItems[key] = dictOutPut.get(key) for key, values in monitorItems.items(): print key,values worksheet.write(row, col, key) worksheet.write(row + 1, col, values) col += 1 workbook.close() def del_ccm_info_xlsx(): if os.path.exists(ccmXlsxFileName): os.remove(ccmXlsxFileName) if (__name__ == "__main__"): parser = xml.sax.make_parser() parser.setFeature(xml.sax.handler.feature_namespaces, 0) Handler = CcmHandler() parser.setContentHandler(Handler) parser.parse("ccm.xml") Handler.writeXls()