最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何用python獲取EXCEL文件內(nèi)容并保存到DBC

 更新時(shí)間:2023年12月18日 11:46:31   作者:逸埃  
很多時(shí)候,使用python進(jìn)行數(shù)據(jù)分析的第一步就是讀取excel文件,下面這篇文章主要給大家介紹了關(guān)于如何用python獲取EXCEL文件內(nèi)容并保存到DBC的相關(guān)資料,需要的朋友可以參考

關(guān)鍵詞

==python、excel、DBC、openpyxl ==

平臺說明

項(xiàng)目Value
python版本3.6

背景

在搭建自動化測試平臺的時(shí)候經(jīng)常會提取DBC文件中的信息并保存為excel或者其他文件格式,用于自動化測試。本文介紹了如何用python3.6實(shí)現(xiàn)獲取EXCEL文件內(nèi)容并保存到DBC。

所需庫

1.canmatrix:需要它庫來解析 DBC 文件,它提供了對 Controller Area Network (CAN) 數(shù)據(jù)的解析功能,包括 DBC 文件的支持。

2.openpyxl :是一個(gè)用于讀寫 Excel 文件的 Python 庫。

實(shí)現(xiàn)過程

方法1.

1.安裝相關(guān)庫

pip install openpyxl canmatrix

2.代碼實(shí)現(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")
        # 報(bào)文發(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如何處理nc數(shù)據(jù)詳解

    利用python如何處理nc數(shù)據(jù)詳解

    目前很多數(shù)據(jù)以nc格式存儲,下面這篇文章主要給大家介紹了關(guān)于利用python如何處理nc數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值。需要的朋友們下面來一起看看吧
    2018-05-05
  • 淺談pyside6 事件處理

    淺談pyside6 事件處理

    事件是PySide6中非常重要的一部分,它們用于響應(yīng)用戶的操作和其他系統(tǒng)事件,下面就來介紹了pyside6 事件處理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-07-07
  • PyCharm搭建一勞永逸的開發(fā)環(huán)境

    PyCharm搭建一勞永逸的開發(fā)環(huán)境

    這篇文章主要介紹了PyCharm搭建一勞永逸的開發(fā)環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Python爬蟲的兩套解析方法和四種爬蟲實(shí)現(xiàn)過程

    Python爬蟲的兩套解析方法和四種爬蟲實(shí)現(xiàn)過程

    本文想針對某一網(wǎng)頁對 python 基礎(chǔ)爬蟲的兩大解析庫( BeautifulSoup 和 lxml )和幾種信息提取實(shí)現(xiàn)方法進(jìn)行分析,及同一網(wǎng)頁爬蟲的四種實(shí)現(xiàn)方式,需要的朋友參考下吧
    2018-07-07
  • 詳解如何使用Python網(wǎng)絡(luò)爬蟲獲取招聘信息

    詳解如何使用Python網(wǎng)絡(luò)爬蟲獲取招聘信息

    在疫情階段,想找一份不錯(cuò)的工作變得更為困難,很多人會選擇去網(wǎng)上看招聘信息??墒钦衅感畔⒂幸恍┦清e(cuò)綜復(fù)雜的。本文將為大家介紹用Python爬蟲獲取招聘信息的方法,需要的可以參考一下
    2022-03-03
  • pip下載安裝時(shí)使用國內(nèi)源配置方式

    pip下載安裝時(shí)使用國內(nèi)源配置方式

    這篇文章主要介紹了pip下載安裝時(shí)使用國內(nèi)源配置方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-04-04
  • 如何安裝并使用conda指令管理python環(huán)境

    如何安裝并使用conda指令管理python環(huán)境

    這篇文章主要介紹了如何使用conda指令管理python環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python腳本實(shí)現(xiàn)依賴漏洞自動掃描工具

    Python腳本實(shí)現(xiàn)依賴漏洞自動掃描工具

    這篇文章主要為大家詳細(xì)介紹了如何通過Python腳本實(shí)現(xiàn)一個(gè)依賴漏洞自動掃描工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-03-03
  • Pygame用數(shù)學(xué)公式實(shí)現(xiàn)心之律動動畫

    Pygame用數(shù)學(xué)公式實(shí)現(xiàn)心之律動動畫

    本文將帶你探索如何使用Python的Pygame庫實(shí)現(xiàn)一個(gè)名為心之律動的粒子動畫,通過數(shù)學(xué)公式生成心形軌跡,并加入煙花爆炸、鼠標(biāo)交互等元素,需要的朋友可以參考下
    2026-02-02
  • python中利用Future對象回調(diào)別的函數(shù)示例代碼

    python中利用Future對象回調(diào)別的函數(shù)示例代碼

    最近在學(xué)習(xí)python,所以這篇文章主要給大家介紹了關(guān)于在python中利用Future對象回調(diào)別的函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09

最新評論

双峰县| 自贡市| 姜堰市| 山西省| 西华县| 库车县| 木里| 邵武市| 宜春市| 夏河县| 鄄城县| 绥芬河市| 逊克县| 保山市| 潞城市| 铅山县| 大荔县| 阳泉市| 丹阳市| 鄂托克旗| 三亚市| 新平| 库尔勒市| 兴宁市| 南召县| 聊城市| 乐山市| 云龙县| 丰顺县| 磴口县| 徐水县| 平安县| 南昌市| 乌兰察布市| 玉环县| 古交市| 徐闻县| 宿州市| 沙河市| 朝阳市| 儋州市|