[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()
相关文章:

[python]用python获取EXCEL文件内容并保存到DBC
目录 关键词平台说明背景所需库实现过程方法1.1.安装相关库2.代码实现 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 背景 在搭建自动化测试平台的时候经常会提取DBC文件中的信息并保存为excel或者其他文件格式,用于自动化测试。本文…...
Spring Boot 如何配置 log4j2
Log4j2 介绍 Spring Boot 中默认使用 Logback 作为日志框架,接下来我们将学习如何在 Spring Boot 中集成与配置 Log4j2。在配置之前,我们需要知道的是 Log4j2 是 Log4j 的升级版,它在 Log4j 的基础上做了诸多改进: 异步日志&…...
如何安装docker
安装Docker的步骤取决于您使用的操作系统。以下是常见操作系统上安装Docker的基本步骤: 对于Linux: 更新软件包索引: sudo apt-get update安装允许apt通过HTTPS使用仓库的包: sudo apt-get install apt-transport-https ca-certificates cur…...
Linux 之 性能优化
uptime $ uptime -p up 1 week, 1 day, 21 hours, 27 minutes$ uptime12:04:11 up 8 days, 21:27, 1 user, load average: 0.54, 0.32, 0.23“12:04:11” 表示当前时间“up 8 days, 21:27,” 表示运行了多长时间“load average: 0.54, 0.32, 0.23”“1 user” 表示 正在登录…...

用Go汇编实现一个快速排序算法
本代码全网首发,使用Go plan9 windows arm64汇编,实现基础版快速排序算法。 未引入随机因子的快速排序的普通Go代码长这样。 func QuickSort(arr []int) {if len(arr) < 1 {return}base, l, r : arr[0], 0, len(arr)-1for i : 1; i < r; {if arr…...
Spring-整合MyBatis
依赖 <dependencies><!--提供数据源--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!--提供sqlSessionFactory…...

sql宽字节注入
magic_quotes_gpc(魔术引号开关) https://www.cnblogs.com/timelesszhuang/p/3726736.html magic_quotes_gpc函数在php中的作用是判断解析用户提交的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以…...

开源 LLM 微调训练指南:如何打造属于自己的 LLM 模型
一、介绍 今天我们来聊一聊关于LLM的微调训练,LLM应该算是目前当之无愧的最有影响力的AI技术。尽管它只是一个语言模型,但它具备理解和生成人类语言的能力,非常厉害!它可以革新各个行业,包括自然语言处理、机器翻译、…...

Android hilt使用
一,添加依赖库 添加依赖库app build.gradle.kts implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49"…...

2023/12/17 初始化
普通变量(int,float,double变量)初始化: int a0; float b(0); double c0; 数组初始化: int arr[10]{0}; 指针初始化: 空指针 int *pnullptr; 被一个同类型的变量的地址初始化(赋值) int…...

【算法Hot100系列】三数之和
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
CSS 简介
什么是 CSS? CSS 是层叠样式表(Cascading Style Sheets)的缩写,是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言。 CSS 的主要作用是: 控制网页的样式,如字体、颜色、背景、布局等提高网页的开发效率CSS 的语法 CSS 的…...

myBatis-plus自动填充插件
在 MyBatis-Plus 3.x 中,自动填充的插件方式发生了变化。现在推荐使用 MetaObjectHandler 接口的实现类来定义字段的填充逻辑。以下是使用 MyBatis-Plus 3.x 自动填充的基本步骤: 1.基本配置 1.1添加 Maven 依赖: 确保你的 Maven 依赖中使…...
746. 使用最小花费爬楼梯 --力扣 --JAVA
题目 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 解题思路 到…...
使用Verdaccio搭建私有npm仓库
搭建团队的私有仓库,保证团队组件的安全维护和私密性,是进阶前端开发主管路上,必不可少的一项技能。 一、原理 我们平时使用npm publish进行发布时,上传的仓库默认地址是npm,通过Verdaccio工具在本地新建一个仓库地址…...

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验
瞬间爆火的Mixtral 8x7B 大家好,我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了,火爆程度压过Google的Gemini。 缘起是MistralAI二话不说,直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…...
Golang 数组 移除元素 双指针法 leetcode27 小记
文章目录 移除元素 leetcode27暴力解法双指针法1. 快慢指针2. 双向指针 移除元素 leetcode27 go中数据类型的分类: 1.值类型:int、float、bool、string、数组、结构体 2.引用类型:指针、切片、map、管道、接口 由于切片为引用类型,…...
c# OpenCV 图像裁剪、调整大小、旋转、透视(三)
图像裁剪、调整大小、旋转、透视图像处理基本操作。 croppedImage 图像裁剪Cv2.Resize() 调整图像大小图像旋转 Cv2.Rotate()旋转Cv2.Flip()翻转Cv2.WarpAffine()任意角度旋转Cv2.GetAffineTransform()透视 一、图像裁剪 // 读取原始图像 Mat image new Mat("1.png&q…...

Kafka相关知识
一、kafka架构 Kafka基础知识 Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于zookeeper协 调的分布式日志系统(也可以当做MQ系统),常见可以用于webynginx日志、访问日志,消息服务等等&…...

gitlab 通过svn hook 触发
jenkins 起一个item 配置: 我选的自由风格的 源码管理配置 先选subversion 就是svn类型 url 设置project 的路径, 注意是工程,不是svn 顶层 添加一个账户来进行pull 等操作 选择添加的账号 构建触发器: ,重要的是要自…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...