python读取dbc文件

python读取dbc文件

方案一:

import os
import re
import copy
import json

class DBC:
    def __init__(self):
        self.dbc_json = {}
        self.bus = {}
        self.signals = {}
        self.node = {}
        filePath = "文件"
        if filePath:
            # print(filePath)
            with open(filePath, "r") as f:  # 打开文件
                self.data = f.read()  # 读取文件
                # print(data)

    def read_bus(self):
        read_bus = re.findall("BO_ (.+?):", self.data)
        # print(read_bus)
        print(read_bus)
        for bus in read_bus:
            bus = str(bus).split()
            print(bus[1])
            dick = {"bus": bus[1]}
            self.dbc_json.update(dick)
        return self.dbc_json

    def read_signals(self):
        signal = re.findall("SG_ (.+?):", self.data)
        for sig in signal:
            i = str(sig).split()
            if len(i) == 1:
                self.signals = {"signal": i[0]}
                print(self.signals)
            else:
                pass

    def read_nodes(self):
        pattern = re.compile(r"BO_ (.*?) (.*?): (.*?) (.*)")
        nodes = re.findall(pattern, self.data)
        node_list = []
        for node in nodes:
            #  ('788', 'CCU_01', '8', 'CGW')
            node_list.append(node[3])
        print(set(node_list))
        return set(node_list)

    def bdc_dick(self):
        for i in self.read_nodes():
            dick_i = {i: []}
            self.dbc_json.update(dick_i)
        print(self.dbc_json)
        for a in self.read_bus():
            dick_a = {a: []}
            self.dbc_json.update()


if __name__ == '__main__':
    dbc = DBC()
    print(dbc.read_signals())

方案二:

import re
import copy

node = []
allDatas = []
siganlList = []
SignalsName = []
messageName = []


def readFile():
    """
    用于解析.dbc
    :return:
    """
    global node, allDatas, siganlList, SignalsName, messageName
    ''' 得到dbc文件的绝对路径'''
    # filePath = find_file()
    filePath = "文件名"
    if filePath:
        print(filePath)
        f = open(filePath, "r")  # 设置文件对象
    else:
        print("读取文件失败!")
        return 0
    """
    NodesPattern:节点
    MessagePattern:消息
    SignalPattern:信号
    """
    NodesPattern = re.compile(r"BU_: (.*)", re.S)
    MessagePattern = re.compile(r"BO_ (.*?) (.*?): (.*?) (.*)", re.S)
    SignalPattern = re.compile('''SG_ (.*?) : (.*?)\|(.*?)@.*? \((.*?),(.*?)\) \[(.*?)\|(.*?)\] "(.*?)" (.*)''', re.S)
    DefaultValue = '''BA_ "GenSig(.*?)" SG_ (\d+) signalname (\d+);'''

    line = f.readline()
    allDatas = []
    while line:
        """ 匹配出节点 """
        NodesSearched = re.search(NodesPattern, line.strip())
        if NodesSearched:
            node = NodesSearched.group(1).split(" ")
            # print(node)
        """ 匹配出消息 """
        MessageSearched = re.search(MessagePattern, line.strip())
        if MessageSearched:
            siganlList.clear()
            """如果匹配到了message,则获取到message的相关参数 
             比如匹配到了NM_Message_ESC_409,则会解析出改message的一些参数构成list对象['1033', 'NM_Message_ESC_409', '8', 'ESC']
             这四个参数分别是 messgage ID ;message name ; messgae dataLenth ,message sender
             而且把这个list对象 加在了 siganlList 索引0的位置
            """
            Message = list(MessageSearched.groups())
            siganlList.append(Message)
            """ 只 要 message的名字 messageName 列表中"""
            messageName.append(Message[1])
            """读取下一行"""
            line = f.readline()
            """因为有些message并没有定义signal,所以 下一行还是message"""
            MessageSearched = re.search(MessagePattern, line.strip())
            SignalSearched = re.search(SignalPattern, line.strip())
            """下一行如果不是message的内容 就一定是signal的内容了"""
            if not MessageSearched:
                while SignalSearched:
                    """获取信号的参数追加到siganlList"""
                    signal = list(SignalSearched.groups())
                    siganlList.append(signal)
                    """只获取 signal name"""
                    SignalsName.append(signal[0])

                    # 再次解析信号,直到这个message下的信号全部解析完毕
                    line = f.readline()
                    SignalSearched = re.search(SignalPattern, line.strip())
            # print(siganlList)
            c = copy.deepcopy(siganlList)
            allDatas.append(c)
        else:
            line = f.readline()
            MessageSearched = re.search(MessagePattern, line.strip())
    f.close()  # 将文件关闭
    return 1


def find_file():
    import os
    path = os.path.abspath('.')
    dirs = os.listdir(path)  # 获取指定路径下的文件
    for i in dirs:
        if os.path.splitext(i)[1] == ".dbc":
            return os.path.join(path, i)


if __name__ == '__main__':
    readFile()
    # print(node)
    # print(messageName)
    # print(SignalsName)
    print(type(SignalsName))
    # print(allDatas)

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python可以使用相应的库来编辑dbc文件。其中较常用的工具是canmatrix库,可以在Python环境下进行安装和使用。 首先,需要在Python中安装canmatrix库。可以使用pip命令来安装,命令如下: pip install canmatrix 安装完成后,可以使用import语句来引入canmatrix库,然后使用open_can_database函数读取dbc文件。例如,使用以下代码可以读取名为example.dbcdbc文件: import canmatrix db = canmatrix.Database() db = canmatrix.formats.loadp("example.dbc") 读取后,可以对dbc文件进行修改或编辑。比如,可以新增或删除节点、消息或者信号等。可以使用canmatrix库提供的各种函数和方法来进行这些修改。例如,可以使用create_frame函数创建新的消息帧: new_frame = canmatrix.Frame("NewFrameID") 然后可以使用add_frame函数来将新的消息帧添加到数据库中: db.add_frame(new_frame) 另外,还可以使用canmatrix库提供的方法来修改现有的节点、消息或信号。例如,可以使用add_signal函数为现有的消息帧添加新的信号: new_signal = canmatrix.Signal() new_signal.name = "NewSignal" new_frame.add_signal(new_signal) 最后,可以使用canmatrix提供的函数将编辑后的dbc文件保存为新的文件,并按需要进行命名。例如,可以使用以下代码保存编辑后的文件为"edited.dbc": canmatrix.formats.dump("edited.dbc", db) 以上就是使用Python编辑dbc文件的基本过程。通过使用canmatrix库,我们可以方便地读取、编辑和保存dbc文件,实现对dbc文件的灵活处理和修改。 ### 回答2: Python提供了很多工具和库来编辑和处理不同类型的文件,包括dbc文件DBC(数据库容器)文件是CAN网络中用于定义通信协议的文件格式。要编辑DBC文件,可以使用Python中的第三方库`cantools`。 首先,需要在Python环境中安装`cantools`库。可以通过pip命令安装: ``` pip install cantools ``` 安装完成后,就可以使用该库来编辑DBC文件。 通过`cantools`库,可以将DBC文件加载为一个数据库对象,然后可以对该对象进行修改和操作。通过`cantools.db.load_file`函数可以加载DBC文件: ```python import cantools # 加载DBC文件 db = cantools.database.load_file('example.dbc') ``` 加载完成后,可以使用`db`对象进行一系列的操作,例如查看定义的消息、信号等信息,修改信号的数值范围等。 下面是一个示例,将加载的DBC文件中某个信号的数值范围修改为新的范围: ```python # 找到对应的信号 signal = db.get_signal_by_name('Signal_Name') # 修改信号的数值范围 signal.min = 0 signal.max = 100 # 保存到新的DBC文件 db.dump('new_dbc.dbc') ``` 以上示例中,首先通过`get_signal_by_name`函数找到需要修改的信号,然后修改信号的`min`和`max`属性,最后使用`dump`函数将修改后的数据库对象保存为新的DBC文件。 通过以上方法,可以利用PythonDBC文件进行编辑和修改。`cantools`库还提供了其他很多功能,可以根据具体需求进行进一步的操作和处理。 ### 回答3: Python是一种高级编程语言,具有丰富的库和模块,可以用来编辑和处理各种文件,包括.dbc文件。 .dbc文件是一种用于描述Controller Area Network (CAN) 通信网络的数据文件,它定义了CAN网络中传输的消息的格式、信号的属性和值等。编辑.dbc文件可以更改一个CAN网络中的消息及其属性,包括更新消息ID、信号名称、信号长度等。 要使用Python来编辑.dbc文件,可以使用第三方库pycan与Python的内置库进行操作。首先,可以使用pycan库中的dbc模块来导入.dbc文件并解析其结构。可以通过读取和修改这些结构来编辑.dbc文件中的消息和信号属性。 在编辑.dbc文件之前,要确保已正确安装pycan库。然后使用以下代码: ```python import can from can.io import dbc # 导入.dbc文件并解析结构 database = dbc.load_file('example.dbc') # 查看消息和信号 print(database.messages) print(database.signals) # 编辑.dbc文件:更新消息ID new_id = 100 database.messages[0].frame_id = new_id # 编辑.dbc文件:更新信号名和长度 new_signal_name = 'new_signal' new_signal_length = 8 database.signals[0].name = new_signal_name database.signals[0].length = new_signal_length # 保存修改后的.dbc文件 database.save('edited.dbc') ``` 上述代码首先导入了pycan库,并使用dbc模块中的load_file函数导入并解析.dbc文件。然后可以查看和编辑.dbc文件中的消息和信号属性。在这个例子中,我们更新了第一个消息的ID,并更新了第一个信号的名称和长度。最后,使用save函数保存修改后的.dbc文件。 通过使用Python和pycan库,可以方便地编辑.dbc文件,实现对CAN网络中消息和信号属性的更新和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

车载testing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值