当前位置: 首页 > news >正文

[python]用python获取EXCEL文件内容并保存到DBC

在这里插入图片描述

目录

  • 关键词
  • 平台说明
  • 背景
  • 所需库
  • 实现过程
    • 方法1.
    • 1.安装相关库
    • 2.代码实现

关键词

==python、excel、DBC、openpyxl ==

平台说明

项目Value
python版本3.6

背景

在搭建自动化测试平台的时候经常会提取DBC文件中的信息并保存为excel或者其他文件格式,用于自动化测试。本文介绍了如何用python3.6实现获取EXCEL文件内容并保存到DBC。

所需库

1.canmatrix:需要它库来解析 DBC 文件,它提供了对 Controller Area Network (CAN) 数据的解析功能,包括 DBC 文件的支持。
2.openpyxl :是一个用于读写 Excel 文件的 Python 库。

实现过程

方法1.

1.安装相关库

pip install openpyxl canmatrix

2.代码实现


from openpyxl import load_workbook
import canmatrixclass MyDBC_Obj:def __init__ (self,dbc_path,excel_path):self.name = "self"self.sheet = ""self.dbc = ""self.dbc_path = dbc_pathself.excel_path = excel_pathdef read_excel(self):workbook = load_workbook(filename = self.excel_path)self.sheet = workbook.activedef generate_dbc(self):self.dbc = canmatrix.CanMatrix()self.dbc.add_global_defines("BusType","STRING")self.dbc.add_define_default("BusType","CAN")# 报文发送类型属性以及默认值self.dbc.add_frame_defines("GenMsgSendType", 'ENUM "Cyclic", "Event"' )self.dbc.add_define_default("GenMsgSendType", "Cyclic")self.dbc.add_frame_defines("GenMsgCycleTime", 'INT 0 65535')self.dbc.add_define_default("GenMsgCycleTime", "0")def write_dbc(self):self.read_excel()self.generate_dbc()ecu_obj = canmatrix.Ecu(self.sheet.cell(1,29).value)ecu_obj.name = self.sheet.cell(1,29).valueself.dbc.add_ecu(ecu_obj)for i in range(2,self.sheet.max_row+1):if self.sheet.cell(row=i,column=1).value == None:self.sheet.cell(row=i,column=1).value = self.sheet.cell(row=i-1,column=1).valueself.sheet.cell(row=i,column=2).value = self.sheet.cell(row=i-1,column=2).valueself.sheet.cell(row=i,column=3).value = self.sheet.cell(row=i-1,column=3).valueself.sheet.cell(row=i,column=4).value = self.sheet.cell(row=i-1,column=4).valueself.sheet.cell(row=i,column=5).value = self.sheet.cell(row=i-1,column=5).valueself.sheet.cell(row=i,column=6).value = self.sheet.cell(row=i-1,column=6).valuemessage_name = ""message_id = 0message_length = 0message_type_is_fd = Falsemessage_type_is_extended = Falsemessage_cycle = 0message_recive = ""frame_obj = canmatrix.Frame()signal_obj=canmatrix.Signal()for row in self.sheet.iter_rows(min_row=3,values_only=True):            signal_name = row[6]if signal_name != None:signal_obj.name = row[6]message_name = row[0]message_id = int(row[2],16)if row[11] != None:signal_obj.start_bit = int(row[11])else:signal_obj.start_bit = 0signal_obj.size = int(row[13])if row[9] == "Motorola":signal_obj.is_little_endian = Falseelse:signal_obj.is_little_endian = Truesignal_obj.initial_value = int(row[21])signal_obj.add_attribute("GenSigStartValue",signal_obj.initial_value)signale_sendtype = 0if row[12] == "Cycle":signale_sendtype = 0else:signale_sendtype = 2signal_obj.add_attribute("GenSigSendType",signale_sendtype)if row[14] == "unsigned":signal_obj.is_float = Falsesignal_obj.is_signed = Falseelif row[14] == "signed":signal_obj.is_float = Falsesignal_obj.is_signed = Trueelse:signal_obj.is_float = Truesignal_obj.is_signed = Falsesignal_obj.min = float(row[17])signal_obj.max = float(row[18])signal_obj.factor = float(row[15])signal_obj.offset = float(row[16])if row[23] != None:signal_obj.unit = row[23]if row[28] == "RX":signal_obj.add_receiver(ecu_obj.name)elif row[28] == "TX":message_recive = ecu_obj.namemessage_sig_group_name = row[8]if  message_sig_group_name != None:signalGroups = frame_obj.signal_group_by_name(message_sig_group_name)if signalGroups == None:frame_obj.add_signal_group(message_sig_group_name,1,signal_obj.name)else:signalGroups.add_signal(signal_obj)if row[24] != None:sigvalue = row[24]st=sigvalue.split("\n")for i in st:if i == "":st.remove(i)d = dict(x.split(":") for x in st)for k, v in d.items():signal_obj.add_values(k,v)             frame_obj.add_signal(signal_obj)#*********** frame type set ***************signal_obj=canmatrix.Signal()if row[5] != None:message_length = int(row[5])else:message_length = 0if row[4] != None:message_cycle = int(row[4])if row[1] == "CAN standard":message_type_is_fd = Falsemessage_type_is_extended = Falseelif row[1] == "CANFD standard":message_type_is_fd = Truemessage_type_is_extended = Falseelif row[1] == "CAN extended":message_type_is_extended = Truemessage_type_is_fd = Falseelif row[1] == "CANFD extended":message_type_is_extended = Truemessage_type_is_fd = Trueelse:frame_obj.name = message_nameframe_obj.size = message_lengthframe_obj.arbitration_id.id = message_idframe_obj.cycle_time = message_cycleframe_obj.is_fd = message_type_is_fdframe_obj.is_j1939 = message_type_is_extendedif message_recive!= "":frame_obj.add_transmitter(ecu_obj.name)self.dbc.add_frame(frame_obj)message_name = ""message_id = 0message_length = 0message_type = Falsemessage_recive = ""signalGroups = []frame_obj = canmatrix.Frame()# 导出到DBC文件file_out = open(self.dbc_path, "wb")canmatrix.formats.dbc.dump(self.dbc,file_out,dbcExportEncoding='utf-8')file_out.close()if __name__ == "__main__":dbc_file_path = "excel.dbc"  # Replace with the actual DBC file pathexcel_file_path = "dbc.xlsx"  # Replace with the desired Excel output pathMyDbc = MyDBC_Obj(dbc_file_path,excel_file_path)MyDbc.write_dbc()

相关文章:

  • 华为电视盒子 EC6108V9C 刷机成linux系统
  • pycharm强制让terminal停止执行的快捷键
  • 【✅如何针对大Excel做文件读取?】
  • MySQL数据库管理优化及高阶语句(用户,权限,索引,事务,存储引擎,备份,视图,查询,存储过程)
  • 医疗智能化革命:AI技术引领医疗领域的创新进程
  • 黑客掌握的定向攻击:内网渗透实战,借用几个开源工具简单几步搞定靶机
  • JVM-1-运行时数据区
  • 05 动态渲染数据
  • Flink系列之:窗口去重
  • 科技的成就(五十四)
  • Linux:TCP 序列号简介
  • php的Url 安全的base64编码解码类
  • ACM32如何保护算法、协议不被破解或者修改
  • C练习题_3答案
  • [论文笔记] chatgpt系列 SparseMOE—GPT4的MOE结构
  • [译]Python中的类属性与实例属性的区别
  • 「面试题」如何实现一个圣杯布局?
  • 345-反转字符串中的元音字母
  • Android Volley源码解析
  • ES6系列(二)变量的解构赋值
  • extjs4学习之配置
  • Git初体验
  • java正则表式的使用
  • ng6--错误信息小结(持续更新)
  • QQ浏览器x5内核的兼容性问题
  • redis学习笔记(三):列表、集合、有序集合
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • V4L2视频输入框架概述
  • Webpack 4 学习01(基础配置)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端面试之CSS3新特性
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 走向全栈之MongoDB的使用
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #Linux(make工具和makefile文件以及makefile语法)
  • #每天一道面试题# 什么是MySQL的回表查询
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (1) caustics\
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (规划)24届春招和25届暑假实习路线准备规划
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (原創) 物件導向與老子思想 (OO)
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Core中Emit的使用
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 设置默认首页
  • .NET框架