用Python把.blf文件解析保存到.csv文件

#以下三个库自行安装
import cantools
import can
import pandas as pd


#根据字段名(信号)解析报文
def parse_signals(msg1537, msg1539, db):
    signal_values = {
        #msg1537中的信号
        "PosLat": None,
        "PosLon": None,
        #msg1539中的信号
        "GroundVel2D": None,
        "VelDown": None,
        "VelEast": None,
        "VelNorth": None
    }

    # 解码报文1537和1539的信号值
    decoded_msg1537 = db.decode_message(msg1537.arbitration_id, msg1537.data)
    decoded_msg1539 = db.decode_message(msg1539.arbitration_id, msg1539.data)
    
    # 将解码的信号值存储到 signal_values 字典中
    for signal in decoded_msg1537:
        if signal in signal_values:
            signal_values[signal] = decoded_msg1537[signal]

    for signal in decoded_msg1539:
        if signal in signal_values:
            signal_values[signal] = decoded_msg1539[signal]

    return signal_values


def turn_to():
    # 加载DBC文件
    dbc_file = r"xxx.dbc"
    db = cantools.db.load_file(dbc_file)
    # 加载blf文件
    f = r"xxx.blf"
    log = can.BLFReader(f)

    msg_ids = [1537, 1539]    #以id为1537, 1539为例
    msg_dict = {msg_id: None for msg_id in msg_ids}

    signal_data = []

    # 遍历CAN日志文件中的每个报文
    for msg in log:
        if msg.is_extended_id:
            msg_id = msg.arbitration_id
        else:
            msg_id = msg.arbitration_id & 0x7FF

        if msg_id in msg_dict:
            msg_dict[msg_id] = msg

            if all(msg is not None for msg in msg_dict.values()):
                signal_values = parse_signals(msg_dict[1537], msg_dict[1539], db)
                signal_data.append(signal_values)
                msg_dict = {msg_id: None for msg_id in msg_ids}

    if signal_data:
        df = pd.DataFrame(signal_data)

        csv_file_path = "xxx.csv"
        try:
            df.to_csv(csv_file_path, index=False)
            print("CSV file saved successfully.")
        except Exception as e:
            print("Error saving CSV file:", str(e))
    else:
        print("No signals found in the message.")

    print("Turn Over!!!")


if __name__ == '__main__':
    turn_to()

解析后如图:

 

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值