如何用python獲取EXCEL文件內(nèi)容并保存到DBC
關(guān)鍵詞
==python、excel、DBC、openpyxl ==
平臺說明
| 項目 | Value |
|---|---|
| python版本 | 3.6 |
背景
在搭建自動化測試平臺的時候經(jīng)常會提取DBC文件中的信息并保存為excel或者其他文件格式,用于自動化測試。本文介紹了如何用python3.6實現(xiàn)獲取EXCEL文件內(nèi)容并保存到DBC。
所需庫
1.canmatrix:需要它庫來解析 DBC 文件,它提供了對 Controller Area Network (CAN) 數(shù)據(jù)的解析功能,包括 DBC 文件的支持。
2.openpyxl :是一個用于讀寫 Excel 文件的 Python 庫。
實現(xiàn)過程
方法1.
1.安裝相關(guān)庫
pip install openpyxl canmatrix
2.代碼實現(xiàn)
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")
# 報文發(fā)送類型屬性以及默認(rèn)值
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()
# 導(dǎo)出到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()總結(jié)
到此這篇關(guān)于如何用python獲取EXCEL文件內(nèi)容并保存到DBC的文章就介紹到這了,更多相關(guān)python獲取EXCEL內(nèi)容保存DBC內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲的兩套解析方法和四種爬蟲實現(xiàn)過程
本文想針對某一網(wǎng)頁對 python 基礎(chǔ)爬蟲的兩大解析庫( BeautifulSoup 和 lxml )和幾種信息提取實現(xiàn)方法進(jìn)行分析,及同一網(wǎng)頁爬蟲的四種實現(xiàn)方式,需要的朋友參考下吧2018-07-07
詳解如何使用Python網(wǎng)絡(luò)爬蟲獲取招聘信息
在疫情階段,想找一份不錯的工作變得更為困難,很多人會選擇去網(wǎng)上看招聘信息??墒钦衅感畔⒂幸恍┦清e綜復(fù)雜的。本文將為大家介紹用Python爬蟲獲取招聘信息的方法,需要的可以參考一下2022-03-03
如何安裝并使用conda指令管理python環(huán)境
這篇文章主要介紹了如何使用conda指令管理python環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
Pygame用數(shù)學(xué)公式實現(xiàn)心之律動動畫
本文將帶你探索如何使用Python的Pygame庫實現(xiàn)一個名為心之律動的粒子動畫,通過數(shù)學(xué)公式生成心形軌跡,并加入煙花爆炸、鼠標(biāo)交互等元素,需要的朋友可以參考下2026-02-02
python中利用Future對象回調(diào)別的函數(shù)示例代碼
最近在學(xué)習(xí)python,所以這篇文章主要給大家介紹了關(guān)于在python中利用Future對象回調(diào)別的函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09

