背景
在配置某些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,但是实际也达到了目的,不妥之处请指出,谢谢。