当前位置: 首页 > 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()

相关文章:

[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汇编实现一个快速排序算法

本代码全网首发&#xff0c;使用Go plan9 windows arm64汇编&#xff0c;实现基础版快速排序算法。 未引入随机因子的快速排序的普通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&#xff08;魔术引号开关&#xff09; https://www.cnblogs.com/timelesszhuang/p/3726736.html magic_quotes_gpc函数在php中的作用是判断解析用户提交的数据&#xff0c;如包括有&#xff1a;post、get、cookie过来的数据增加转义字符“\”&#xff0c;以…...

开源 LLM 微调训练指南:如何打造属于自己的 LLM 模型

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

Android hilt使用

一&#xff0c;添加依赖库 添加依赖库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 初始化

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

【算法Hot100系列】三数之和

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

CSS 简介

什么是 CSS? CSS 是层叠样式表(Cascading Style Sheets)的缩写,是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言。 CSS 的主要作用是: 控制网页的样式,如字体、颜色、背景、布局等提高网页的开发效率CSS 的语法 CSS 的…...

myBatis-plus自动填充插件

在 MyBatis-Plus 3.x 中&#xff0c;自动填充的插件方式发生了变化。现在推荐使用 MetaObjectHandler 接口的实现类来定义字段的填充逻辑。以下是使用 MyBatis-Plus 3.x 自动填充的基本步骤&#xff1a; 1.基本配置 1.1添加 Maven 依赖&#xff1a; 确保你的 Maven 依赖中使…...

746. 使用最小花费爬楼梯 --力扣 --JAVA

题目 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 解题思路 到…...

使用Verdaccio搭建私有npm仓库

搭建团队的私有仓库&#xff0c;保证团队组件的安全维护和私密性&#xff0c;是进阶前端开发主管路上&#xff0c;必不可少的一项技能。 一、原理 我们平时使用npm publish进行发布时&#xff0c;上传的仓库默认地址是npm&#xff0c;通过Verdaccio工具在本地新建一个仓库地址…...

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验

瞬间爆火的Mixtral 8x7B 大家好&#xff0c;我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了&#xff0c;火爆程度压过Google的Gemini。 缘起是MistralAI二话不说&#xff0c;直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…...

Golang 数组 移除元素 双指针法 leetcode27 小记

文章目录 移除元素 leetcode27暴力解法双指针法1. 快慢指针2. 双向指针 移除元素 leetcode27 go中数据类型的分类&#xff1a; 1.值类型&#xff1a;int、float、bool、string、数组、结构体 2.引用类型&#xff1a;指针、切片、map、管道、接口 由于切片为引用类型&#xff0c…...

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公司开发&#xff0c;是一个分布式、分区的、多副本的、多生产者、多订阅者&#xff0c;基于zookeeper协 调的分布式日志系统(也可以当做MQ系统)&#xff0c;常见可以用于webynginx日志、访问日志&#xff0c;消息服务等等&…...

gitlab 通过svn hook 触发

jenkins 起一个item 配置&#xff1a; 我选的自由风格的 源码管理配置 先选subversion 就是svn类型 url 设置project 的路径&#xff0c; 注意是工程&#xff0c;不是svn 顶层 添加一个账户来进行pull 等操作 选择添加的账号 构建触发器&#xff1a; &#xff0c;重要的是要自…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

用docker来安装部署freeswitch记录

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

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

在鸿蒙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. 内联样式: 简单直观,适合动态样式和…...