如何通过Python脚本读取并打印BLF文件内容?
如何通过Python脚本读取并打印BLF文件内容?
我明白你现在遇到的麻烦——Wireshark能正常打开这个21.8MB、包含5万条记录的BLF文件,但用Python脚本读取时既没输出也没报错,这确实挺让人摸不着头脑的。咱们一步步来排查和解决这个问题:
先看你代码里的小问题
你原来的代码中,if log.is_empty:放在了for循环之后,这会导致即使文件里有消息,循环执行完后才会判断,而BLFLogReader的is_empty属性其实是在初始化时就确定的,所以这个判断逻辑不太对。而且如果循环没执行(比如没读到消息),这个判断才会触发,但你没看到输出,说明要么循环没跑,要么消息没被正确读取。
改进后的代码方案
我给你调整了代码,增加了调试确认步骤,能先看到读取到的总消息数,再逐条打印详细内容:
import can # 用原始字符串避免路径转义问题 blf_file_path = r"C:/Users/sahaanan/Desktop/blf_to_pcap/NewSW_7209_Lines.blf" try: with open(blf_file_path, 'rb') as blf_file: # 初始化BLF读取器 log_reader = can.BLFLogReader(blf_file) # 把所有消息转成列表,方便统计和遍历 can_messages = list(log_reader) if not can_messages: print("⚠️ 读取到的BLF文件为空") else: print(f"✅ 成功读取到 {len(can_messages)} 条CAN消息") # 逐条打印消息的关键信息(ID、数据、时间戳) for idx, msg in enumerate(can_messages): # 这里可以根据需求调整打印内容,比如只打印前10条测试 if idx < 10: print(f"消息{idx+1}: ID=0x{msg.arbitration_id:08X}, 数据={msg.data.hex()}, 时间戳={msg.timestamp:.6f}") # 如果消息太多,打印提示 if len(can_messages) > 10: print(f"... 省略剩余 {len(can_messages)-10} 条消息") except Exception as e: print(f"❌ 读取BLF文件出错: {str(e)}")
排查方向参考
如果上面的代码还是没输出,可以试试这些方式:
- 确认文件路径:用原始字符串
r"路径"或者双反斜杠\\,避免Windows路径的转义问题,也可以手动打印路径是否正确:print(blf_file_path) - 检查python-can版本兼容性:你用的是python-can 4.2.2,有些旧版本可能对特定BLF格式支持不好,试试升级到最新版本:
pip install --upgrade python-can - 用其他工具验证读取:比如用
pyshark调用Wireshark的解析能力(需要Wireshark已安装且tshark在系统PATH中):
如果这个能输出,说明文件本身没问题,问题出在python-can的解析逻辑上,可以去python-can的仓库看看是否有相关的适配问题。import pyshark cap = pyshark.FileCapture(r"C:/Users/sahaanan/Desktop/blf_to_pcap/NewSW_7209_Lines.blf") print(f"总数据包数: {cap.packet_count}") for pkt in cap[:10]: print(pkt) - 检查文件是否被占用:确保Wireshark已经关闭了这个BLF文件,避免文件被锁定导致无法读取。
备注:内容来源于stack exchange,提问作者Sand




