[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 canmatrix

class MyDBC_Obj:
    def __init__ (self,dbc_path,excel_path):
        self.name = "self"
        self.sheet = ""
        self.dbc = ""
        self.dbc_path = dbc_path
        self.excel_path = excel_path

    def read_excel(self):
        workbook = load_workbook(filename = self.excel_path)
        self.sheet = workbook.active

    def 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).value
        
        self.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).value
                self.sheet.cell(row=i,column=2).value = self.sheet.cell(row=i-1,column=2).value
                self.sheet.cell(row=i,column=3).value = self.sheet.cell(row=i-1,column=3).value
                self.sheet.cell(row=i,column=4).value = self.sheet.cell(row=i-1,column=4).value
                self.sheet.cell(row=i,column=5).value = self.sheet.cell(row=i-1,column=5).value
                self.sheet.cell(row=i,column=6).value = self.sheet.cell(row=i-1,column=6).value
        message_name = ""
        message_id = 0
        message_length = 0
        message_type_is_fd = False
        message_type_is_extended = False
        message_cycle = 0
        message_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 = 0
                signal_obj.size = int(row[13])
                if row[9] == "Motorola":
                    signal_obj.is_little_endian = False
                else:
                    signal_obj.is_little_endian = True
                signal_obj.initial_value = int(row[21])
                signal_obj.add_attribute("GenSigStartValue",signal_obj.initial_value)
                signale_sendtype = 0
                if row[12] == "Cycle":
                    signale_sendtype = 0
                else:
                    signale_sendtype = 2
                signal_obj.add_attribute("GenSigSendType",signale_sendtype)
                if row[14] == "unsigned":
                    signal_obj.is_float = False
                    signal_obj.is_signed = False
                elif row[14] == "signed":
                    signal_obj.is_float = False
                    signal_obj.is_signed = True
                else:
                    signal_obj.is_float = True
                    signal_obj.is_signed = False

                signal_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.name

                message_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 = 0
                if row[4] != None:
                    message_cycle = int(row[4])
                if row[1] == "CAN standard":
                    message_type_is_fd = False
                    message_type_is_extended = False
                elif row[1] == "CANFD standard":
                    message_type_is_fd = True
                    message_type_is_extended = False
                elif row[1] == "CAN extended":
                    message_type_is_extended = True
                    message_type_is_fd = False
                elif row[1] == "CANFD extended":
                    message_type_is_extended = True
                    message_type_is_fd = True
            else:
                frame_obj.name = message_name
                frame_obj.size = message_length
                frame_obj.arbitration_id.id = message_id
                frame_obj.cycle_time = message_cycle
                frame_obj.is_fd = message_type_is_fd
                frame_obj.is_j1939 = message_type_is_extended
                if message_recive!= "":
                    frame_obj.add_transmitter(ecu_obj.name)
                self.dbc.add_frame(frame_obj)
                message_name = ""
                message_id = 0
                message_length = 0
                message_type = False
                message_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 path
    excel_file_path = "dbc.xlsx"  # Replace with the desired Excel output path
    MyDbc = MyDBC_Obj(dbc_file_path,excel_file_path)
    MyDbc.write_dbc()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/253117.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章了解Flutter Json系列化和反序列化

目录 一. 使用dart:convert实现JSON格式编解码1. 生成数据模型类2. 将JSON数据转化成数据模型类3. 数据模型类转化成JSON字符串 二、借助json_serializable实现Json编解码1.添加json_annotation、build_runner、json_serializable依赖2. 创建一个数据模型类3. 使用命令行生成JS…

http状态码(一)400报错

一 400报错汇总 ① 综述 一、4xx状态码报错说明: 客户端行为导致的报错二、通用的4xxHTTP报错1) 4002) 4013) 4034) 4045) 405 --> 不允许方法,可能跨域或者nginx限制请求方法6) 4087) 4138) 419三、ngin自身定义的4xx报错495、496、497、498、4…

centOS7 安装tailscale并启用子网路由

1、在centOS7上安装Tailscale客户端 #安装命令所在官网位置:https://tailscale.com/download/linux #具体命令为: curl -fsSL https://tailscale.com/install.sh | sh #命令执行后如下图所示2、设置允许IP转发和IP伪装。 安装后,您可以启动…

Python框架批量数据抓取的高级教程

一、背景介绍 批量数据抓取是一种常见的数据获取方式,能够帮助我们快速、高效地获取网络上的大量信息。本文将介绍如何使用Python框架进行大规模抽象数据,以及如何处理这个过程中可能遇到的问题。 二、项目需求 我们将爬取大量知乎文章,讨…

机器学习 | 机器学习基础知识

一、机器学习是什么 计算机从数据中学习规律并改善自身进行预测的过程。 二、数据集 1、最常用的公开数据集 2、结构化数据与非结构化数据 三、任务地图 1、分类任务 Classification 已知样本特征判断样本类别二分类、多分类、多标签分类 二分类:垃圾邮件分类、图像…

为什么选择计算机?大数据时代学习计算机的价值探讨

还记得当初自己为什么选择计算机? 计算机是在90年代兴起的专业,那时候的年轻人有驾照、懂外语、懂计算机是很时髦的事情! 当初你问我为什么选择计算机,我笑着回答:“因为我梦想成为神奇的码农!我想像编织魔法一样编写程序,创造出炫酷的虚拟世界!”谁知道,我刚入门的…

Leetcode刷题笔记题解(C++):224. 基本计算器

思路: step 1:使用栈辅助处理优先级,默认符号为加号。 step 2:遍历字符串,遇到数字,则将连续的数字字符部分转化为int型数字。 step 3:遇到左括号,则将括号后的部分送入递归&#x…

java --- 异常

目录 一、异常体系介绍 二、异常的作用 三、异常处理方式 3.1 捕获异常 2.1 灵魂一问: 如果try中没有遇到问题,如何执行? 2.2 灵魂二问:如果try中可能会遇到多个问题,怎么执行? 2.3 灵魂三问&#x…

动态规划优化技巧

一、斐波那契系列 1、滚动数组优化空间复杂度 2、dp数组初始化/处理边界优化 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

NtripShare Mos监测平台边缘计算终端与自动优化平差算法

忙忙乎乎23年又要过去了,回头看今年做的事,只有两件事值得一提: 1、自动化监测边缘计算终端; 2、自动优化平差算法。 自动化监测边缘计算终端 终端采用全国产硬件方案终端支持全站仪供电控制终端支持远程控制终端支持数据缓存技…

WebLangChain_ChatGLM:结合 WebLangChain 和 ChatGLM3 的中文 RAG 系统

WebLangChain_ChatGLM 介绍 本文将详细介绍基于网络检索信息的检索增强生成系统,即 WebLangChain。通过整合 LangChain,成功将大型语言模型与最受欢迎的外部知识库之一——互联网紧密结合。鉴于中文社区中大型语言模型的蓬勃发展,有许多可供利…

arcgis更改服务注册数据库账号及密码

最近服务器数据库密码换了,gis服务也得换下数据库连接密码。传统官方的更改方式(上传连接配置文件): ArcGIS Server数据库注册篇(I) — 更新数据库密码_arcgis server sde换密码-CSDN博客 方式太麻烦了,需要安装ArcG…

PyTorch自动梯度计算(注意点)

if params.grad is not None: params.grad.zero_() 我们实际的运算往往会涉及到若干个requires-grad为true的张量进行运算,在这种情况下,Pytorch会计算整个计算图上的损失的导数,并把这些结果累加到grad属性中。多次调用backward()会导致梯度…

数据结构与算法—哈希表

哈希表 文章目录 哈希表1. 问题引出2. 基本介绍3. 应用实例 1. 问题引出 看一个实际需求,google公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄等),当输入该员工的id时&#…

CodeBlocks定义异常:multiple definition of 和 first defined here

基于链表实现贪吃蛇案例时候,在CodeBlocks的CPP源文件定义函数和全局变量均报错 异常现象 在**自定义的cpp**文件定义全局变量、对象、函数等均出现重复定义和首次定义 multiple definition of Controller::showCopy() first defined here 异常解决方案 正确代码…

RabbitMQ手动应答与持久化

1.SleepUtil线程睡眠工具类 package com.hong.utils;/*** Description: 线程睡眠工具类* Author: hong* Date: 2023-12-16 23:10* Version: 1.0**/ public class SleepUtil {public static void sleep(int second) {try {Thread.sleep(1000*second);} catch (InterruptedExcep…

HashMap构造函数解析与应用场景

目录 1. HashMap简介 2. HashMap的构造函数 2.1 默认构造函数 2.2 指定初始容量和加载因子的构造函数 3. 构造函数参数的影响 3.1 初始容量的选择 3.2 加载因子的选择 4. 构造函数的应用场景 4.1 默认构造函数的应用场景 4.2 指定初始容量和加载因子的构造函数的应用…

海安行车记录仪avi杀病毒导致文件丢失的恢复案例

海安行车记录仪,听名字就知道是个小小小品牌,而且用的文件格式是比较古老的AVI,这种文件格式是微软设计的,后来并没有普及(不支持4G以上大文件而且结构过于松散)。这个恢复案例比较特殊的地方是不太清楚做过…

教师如何维护学生的自尊心

作为教师,我们不仅要传授知识,更要关心学生的身心健康,特别是他们的自尊心。自尊心是个人自我价值的重要体现,对学生的学习、生活和未来的发展都有深远的影响。因此,维护学生的自尊心是教师的重要责任。 教师要尊重每…

[Verilog] Verilog 操作符与表达式

主页: 元存储博客 文章目录 前言1. 操作符2. 操作数3 表达式总结 前言 1. 操作符 图片来源: https://www.runoob.com/ Verilog语言中使用的操作符包括: 算术操作符:加法()、减法(-)、乘法(*)、除法(/)、取模(%)、自增()、自减(–…