[Python工具]-转配置信息为xml文件

背景

在配置某些sensor寄存器时,实际软件中会通过xml文件的内容读取,例如qcom的camera sensor的配置;而sensor厂商提供的配置往往时一个txt文件的类型,比如下列方式

红色框为寄存器,绿框为mode0,蓝框为mode1;

当目的时配置为如下xml信息时,如果寄存器的较少还行,太多copy非常耗时,在此背景下为了提升效率,查阅资料写了一个txt转为指定xml格式的工具。

软件目的

功能1:解析txt的内容;

功能2:将txt的寄存器信息保存到excel中便于查看;

功能3:将寄存器配置存储为xml文件,每一个mode存为一个单独的xml;

源码

tips:

  • 具体xml文件的格式可自行在代码中修改,当前工具hardcode;

  • 具体解析txt文件的方式,可以自行修改正则表达式;

from xml.dom.minidom import Document
import re
import xlrd
import xlwt
from xlrd import open_workbook
from math import log

"""
<regSetting>
    <registerAddr> </registerAddr>
    <registerData> </registerData>
    <regAddrType range="[1, 4]"> </regAddrType>
    <regDataType range="[1, 4]"> </regDataType>
    <operation> </operation>
    <delayUs> </delayUs>
</regSetting>

"""
g_excle_file_name = "RegInfo.xls"
g_sheet_name="reg_sheet"

def write_regs_to_xml(regAddrs, regDatas, xml_name):

    # 实例化一个Domcument
    dom = Document()

    regSettings = dom.createElement("regSettings")
    dom.appendChild(regSettings)

    for i in range(len(regAddrs)):

        # 创建根节点
        regSetting = dom.createElement("regSetting")
        # 将根节点添加到domcument中
        regSettings.appendChild(regSetting)
        # 循环遍历所有数据,写入domcument中

        registerAddr = dom.createElement("registerAddr")
        regSetting.appendChild(registerAddr)
        registerAddrInfo = dom.createTextNode(regAddrs[i])
        registerAddr.appendChild(registerAddrInfo)

        registerData = dom.createElement("registerData")
        regSetting.appendChild(registerData)
        registerDataInfo = dom.createTextNode(regDatas[i])
        registerData.appendChild(registerDataInfo)

        regAddrType = dom.createElement("regAddrType")
        regSetting.appendChild(regAddrType)
        registerAddrTypeInfo = dom.createTextNode("2")
        regAddrType.appendChild(registerAddrTypeInfo)
        regAddrType.setAttribute("range",'[1, 4]')

        regDataType = dom.createElement("regDataType")
        regSetting.appendChild(regDataType)
        registerDataTypeInfo = dom.createTextNode("1")
        regDataType.appendChild(registerDataTypeInfo)
        regDataType.setAttribute("range",'[1, 4]')

        operation = dom.createElement("operation")
        regSetting.appendChild(operation)
        operationInfo = dom.createTextNode("WRITE")
        operation.appendChild(operationInfo)

        delayUs = dom.createElement("delayUs")
        regSetting.appendChild(delayUs)
        delayUsInfo = dom.createTextNode("0")
        delayUs.appendChild(delayUsInfo)

    with open(xml_name,'w',encoding='utf-8') as f:
        # f:文件对象,indent:每个tag前面填充的字符,addindent:每个子节点的缩进字符,newl:每个tag后填充的字符
        dom.writexml(f, indent='\t', newl='\n', addindent='\t')
        f.close()

sensor_mode_xml_name = ["mode_0.xml", "mode_1.xml"]

def read_from_excle_and_save_xml():
    with open_workbook(g_excle_file_name) as workbook:
        worksheet = workbook.sheet_by_name(g_sheet_name)
        # addrs_list = [str(worksheet.cell_value(i, 0)) for i in range((0, worksheet.nrows))]
        print("nrows : ncols", worksheet.nrows, worksheet.ncols)
        addrs_list=[]
        for i in range(0, worksheet.nrows):
            addrs_list.append(str(worksheet.cell_value(i, 0)))
        print(addrs_list)

        for j in range(1, worksheet.ncols):
            reg_data_list=[]
            for k in range(0, worksheet.nrows):
                reg_data_list.append(str(worksheet.cell_value(k, j)))
            # write_regs_to_xml(addrs_list, reg_data_list, sensor_mode_xml_name[j-1])
            write_regs_to_xml(addrs_list, reg_data_list, "mode_x{}.xml".format(j-1))
            

def read_file_and_save_to_excel():
    with open('test.txt','r') as f:
        f = open('test.txt','r')
        #逐行读取文件内容
        lines = f.readlines()
        # print(lines)

    workbook = xlwt.Workbook(encoding= 'ascii')
    worksheet = workbook.add_sheet(g_sheet_name)
    row = 0
    cloumn = 0

    for each_line in lines:
        if each_line.strip() == "":
            print("find one null row")
            continue

        # 匹配16进制的数字
        data_info = re.finditer(r'\b0x[0-9a-fA-F]+\b', each_line)
        print("write row : cloumn ", row, cloumn)
        print(each_line)

        cloumn = 0
        for data in data_info:
            # print(data.group())
            # print("write row : cloumn ", row, cloumn)
            worksheet.write(row, cloumn, data.group())
            cloumn = cloumn + 1
        row = row + 1

    f.close()
    workbook.save(g_excle_file_name)

def main():

    read_file_and_save_to_excel()
    read_from_excle_and_save_xml()

if __name__ == '__main__':
    main()

结果

输出:

不太熟悉python,但是实际也达到了目的,不妥之处请指出,谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值