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

news2024/11/28 8:40:51

在这里插入图片描述

目录

  • 关键词
  • 平台说明
  • 背景
  • 所需库
  • 实现过程
    • 方法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.coloradmin.cn/o/1318633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STL容器之string(上)

目录 什么是STL string类 string类常见接口 string类的常见构造函数 string类对象的容器操作 string类对象的访问及遍历操作 string类对象的修改操作 拓展 从本期开始,我们将正式学习C中的STL,美国的麦克阿瑟将军说过:“C不能没有STL就…

轻量封装WebGPU渲染系统示例<52>- Json数据描述材质、纹理等3D渲染场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene3.ts 当前示例运行效果: ​​​​​​​ Json数据: {"renderer": {"mtplEnabled": true,"camera": {"eye&quo…

Linux实操——安装Mysql

安装Mysql 一、检查是否已经安装了mariadb数据库,并卸载二、下载mysql包,并通过ftp上传到服务器三、解压安装包四、创建数据存储文件夹五、创建执行mysqld命令的用户,并初始化mysql六、启用传输安全七、启动mysql,验证是否安装成功 总结 博主…

若依 ruoyi-vue3+ts-plus+ 宇道 yudao-ruoyi-vue-pro前端显示部门名称

想在 index.vue 上显示列表里对应的部门名称 效果 引入dept import * as DeptApi from "/api/system/dept"; 初始化时 /** 初始化 **/ onMounted(async () > {getList();deptNameList.value await DeptApi.getSimpleDeptList(); }) 加载id 对应的部门名称 …

威联通硬盘休眠后修改系统定时任务

按照网上一些教程,成功将威联通的机械硬盘设置了自动休眠。但是发现每天有多个整点硬盘会自动唤醒,怀疑是系统内置的定时任务触发了硬盘唤醒。 通过查看系统日志中事件和访问记录,判断出一些引发硬盘唤醒的自动任务,将这些定时任…

机器学习项目精选 第一期:超完整数据科学资料合集

大噶吼,不说废话,分享一波我最近看过并觉得非常硬核的资源,包括Python、机器学习、深度学习、大模型等等。 1、超完整数据科学资料合集 地址:https://github.com/krishnaik06/The-Grand-Complete-Data-Science-Materials Pytho…

【基础算法】试除法判定质数(优化)

文章目录 算法优化模板题目代码实现 算法优化模板 bool is_prime(int n){if(n < 2) return false;for(int i 2;i < n / i;i ){ //优化内容if(n % i 0){return false;}}return true; }注意这里的一个总要优化是for循环的终止条件是i<n/i。为什么不是i<n或者i<…

Java EE 网络之网络初识

文章目录 1. 网络发展史1.1 独立模式1.2 网络互连1.3 局域网 LAN1.4 广域网 WAN 2. 网络通信基础2.1 IP 地址2.2 端口号2.3 认识协议2.4 五元组2.5 协议分层2.5.1 什么是协议分层2.5.2 分层的作用2.5.3 OSI七层协议2.5.4 TCP/IP五层协议2.5.5 网络设备所在分层 2.6 分装和分用 …

10天玩转Python第9天:python 面向对象 全面详解与代码示例

今日内容 异常 模块和包 导入模块(导包)if __name__ "__main__": Unitest 框架的学习 了解, 基本组成 异常 异常传递[了解] 异常传递是 Python 中已经实现好了,我们不需要操作, 我们知道异常会进行传递. ​ 异常传递: 在函数嵌套调用的过程中, 被调用的函数 ,发…

获取MODIS的NDVI/EVI产品

目录 简介源代码运行流程参考博文 简介 本项目是使用MODIS的NDVI产品&#xff08;MOD13Q1&#xff09;,可获取从2000年至今的所有数据&#xff0c;更新频率为16天 MOD13Q1 V6.1产品以每像素为基础提供植被指数(VI)值。这里有两个主要的植被层。第一种是归一化植被指数(NDVI)&a…

LeedCode刷题---滑动窗口问题(二)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、将X减到0的最小操作数 题目链接&#xff1a;将 x 减到 0 的最小操作数 题目描述 给你一个整数数组 nums 和一个整数 x 。每一…

MetaAI语音翻译大模型Seamless登场,主打AI无缝同声传译

论文题目&#xff1a; Seamless: Multilingual Expressive and Streaming Speech Translation 论文链接&#xff1a; https://ai.meta.com/research/publications/seamless-multilingual-expressive-and-streaming-speech-translation/ 代码链接&#xff1a; GitHub - facebook…

2024年转行软件测试,报培训班3个月出来就是高薪工作,真的靠谱吗?

作为一个已在IT行业工作8年&#xff0c;分享一下我的经验&#xff0c;供大家参考。 讲真&#xff0c;现在想通过培训班培训几个月就进入IT行业&#xff0c;越来越来难了&#xff1b;如果是在2018年以前&#xff0c;还有机会&#xff0c;一方面&#xff0c;那个时候IT行业还不算…

Linux系统log日志简单清理

系统空间告急 清理log日志 找出当前目录中文件最大的10个文件&#xff1a; cd /var/log du -s ./* | sort -nr | head 系统日志log文件&#xff1a; ll -h /var/log/journal 只保留100MB的日志 journalctl --vacuum-size100M 系统暴力爆破SSH日志&#xff1a; ll -h /var/lo…

Flask基本用法:一个HelloWorld,搭建服务、发起请求

目录 1、简介 2、安装 3、Flask使用示例 参考 1、简介 官网文档 Flask是一个轻量的web服务框架&#xff0c;我们可以利用它快速搭建一个服务&#xff0c;对外提供接口&#xff0c;其他人可以轻松调用我们的服务。这对算法工程师来说比较关键&#xff0c;我们通常不擅长搞开发…

【精选】计算机网络教程(第2章网络层)

目录 前言 第2章网络层 1、编码与调制 2、传输方式 前言 总结计算机网络教程课程期末必记知识点。 第2章网络层 1、编码与调制 信道可以分成传送模拟信号的模拟信道和传送数字信号的数字信道两大类。通常人们将数字数据转换成数字信号的过程称为编码&#xff0c;而将数字…

leetcode刷题日志-383赎金信

思路&#xff1a;分别用两个map记录ransomNote和magazine中的字符以及出现的次数。最后遍历记录ransomNote的map&#xff0c;如果ransomNote的map中出现的magazine的map中没有出现或者出现的次数小于ransomNote的map则返回false&#xff0c;否则返回true&#xff1b; class So…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型&#xff0c;使用Kaggle开源数据集&#xff0c;旨在提取图片中的用户特征&#xff0c;最终在移…

我们来谈谈葡萄酒泡泡吧

香槟是任何庆祝场合的最佳搭配。从婚礼和生日到单身派对和典型的周五晚上&#xff0c;这款气泡饮料是生活中特别聚会的受欢迎伴侣。 来自云仓酒庄品牌雷盛红酒分享你知道吗&#xff0c;你喜欢喝的那瓶香槟酒可能根本不是香槟&#xff0c;而是汽酒&#xff1f;你不是唯一一个认为…

UE虚幻引擎项目更改名字怎么操作?

首先找到项目目录&#xff0c;直接更改项目程序的名字&#xff0c;其次点击项目程序右击使用文本打开&#xff0c;然后将Modules模块中的内容删除即可&#xff0c;然后运行程序就好啦&#xff01;