尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
用 Python 一键把 ASC 文件转成 BLF(基于 python-can)
用 Python 一键把 ASC 文件转成 BLF基于 python-can做车载/嵌入式 CAN 总线开发时Vector 的 CANoe/CANalyzer/ canoe log 常用两种格式ASC文本格式人能看懂但体积大、加载慢和BLF二进制格式体积小、加载快CANoe 打开体验更好。本文分享一个不到 110 行的 Python 小工具支持单个文件转换和整个目录批量转换。一、为什么要转 BLF对比项ASCBLF类型纯文本二进制体积大通常是 BLF 的 5~10 倍小CANoe 加载速度慢大文件要等很久快可读性记事本直接能看需要工具通用性几乎所有工具支持Vector 系工具、python-can 支持结论日常抓包、调试时 ASC 够用但如果要长期归档、发给同事分析、或者在CANoe 里打开几个 G 的日志转成 BLF 体验会好很多。二、环境准备只需要一个依赖python-can。pipinstallpython-canpython-can 内置了ASCReader和BLFWriter两个类读写逻辑它都帮我们做好了我们要做的只是读出来再写进去。三、完整代码保存为asc_to_blf.py#!/usr/bin/env python ASC to BLF converter using python-can library. 用法: python asc_to_blf.py # 转换当前目录下所有 .asc 文件 python asc_to_blf.py input.asc # 转换单个 .asc 文件 python asc_to_blf.py input.asc output.blf # 指定输出文件名 依赖安装: pip install python-can importsysimportosimportglobfrompathlibimportPathdefconvert_asc_to_blf(asc_path,blf_path):将单个 ASC 文件转换为 BLF 文件importcanprint(f正在读取:{asc_path})msgs[]withcan.ASCReader(asc_path)asreader:formsginreader:msgs.append(msg)ifnotmsgs:print(f警告:{asc_path}中未找到任何 CAN 消息跳过。)returnFalseprint(f正在写入{len(msgs)}条消息到:{blf_path})withcan.BLFWriter(blf_path)aswriter:formsginmsgs:writer.on_message_received(msg)print(f转换完成:{asc_path}-{blf_path})returnTruedefconvert_all_asc_in_directory(directory):批量转换目录下所有 .asc 文件asc_filesglob.glob(os.path.join(directory,*.asc))asc_files.extend(glob.glob(os.path.join(directory,*.ASC)))# 支持大写扩展名asc_fileslist(set(asc_files))# 去重ifnotasc_files:print(f在目录{directory}中未找到任何 .asc 文件)return0,0print(f找到{len(asc_files)}个 ASC 文件)print(-*50)success_count0fail_count0forasc_pathinasc_files:blf_pathos.path.splitext(asc_path)[0].blftry:ifconvert_asc_to_blf(asc_path,blf_path):success_count1else:fail_count1exceptExceptionase:print(f转换失败:{asc_path}-{e})fail_count1print(-*50)print(f批量转换完成: 成功{success_count}个, 失败{fail_count}个)returnsuccess_count,fail_countif__name____main__:try:importcanexceptImportError:print(错误: 未安装 python-can。请执行: pip install python-can)sys.exit(1)# 获取当前脚本所在目录script_diros.path.dirname(os.path.abspath(__file__))iflen(sys.argv)2:# 命令行参数模式支持单文件或指定目录input_pathsys.argv[1]ifos.path.isdir(input_path):# 指定了目录success,failconvert_all_asc_in_directory(input_path)sys.exit(0iffail0else1)elifos.path.isfile(input_path):# 指定了单个文件iflen(sys.argv)3:blf_pathsys.argv[2]else:blf_pathos.path.splitext(input_path)[0].blftry:ifconvert_asc_to_blf(input_path,blf_path):sys.exit(0)else:sys.exit(1)exceptExceptionase:print(f错误:{e})sys.exit(1)else:print(f错误: 路径不存在 -{input_path})sys.exit(1)else:# 无参数转换当前脚本所在目录下所有 .asc 文件success,failconvert_all_asc_in_directory(script_dir)sys.exit(0iffail0else1)四、使用方法脚本支持三种调用方式# 1. 不带参数批量转换脚本所在目录下的所有 .asc 文件python asc_to_blf.py# 2. 指定单个文件输出同名 .blfpython asc_to_blf.py demo.asc# 3. 指定输入输出文件名python asc_to_blf.py demo.asc output.blf# 4. 传入目录批量转换该目录下所有 .ascpython asc_to_blf.py D:\can_logs运行效果找到 3 个 ASC 文件 -------------------------------------------------- 正在读取: D:\can_logs\run1.asc 正在写入 128456 条消息到: D:\can_logs\run1.blf 转换完成: D:\can_logs\run1.asc - D:\can_logs\run1.blf 正在读取: D:\can_logs\run2.asc 正在写入 98233 条消息到: D:\can_logs\run2.blf 转换完成: D:\can_logs\run2.asc - D:\can_logs\run2.blf -------------------------------------------------- 批量转换完成: 成功 3 个, 失败 0 个五、几个实现细节1. 为什么要先import can再检查try:importcanexceptImportError:print(错误: 未安装 python-can。请执行: pip install python-can)sys.exit(1)放在__main__入口处做一次前置体检比让用户看到一堆红色ModuleNotFoundError友好得多。2. 先全部读入再写入代码里先把消息存进msgs列表再统一写 BLF好处是可以先判断文件是否为空ifnotmsgs:print(f警告:{asc_path}中未找到任何 CAN 消息跳过。)returnFalse避免出现生成了一个 0 字节的 BLF这种尴尬情况。⚠️ 小提示这种写法会把所有消息驻留在内存里。如果是几个 G 的超大 ASC 文件建议改成边读边写的流式方式去掉msgs列表直接在循环里writer.on_message_received(msg)。3. 兼容大写扩展名asc_filesglob.glob(os.path.join(directory,*.asc))asc_files.extend(glob.glob(os.path.join(directory,*.ASC)))asc_fileslist(set(asc_files))# 去重在Windows上glob是大小写不敏感的所以set()去重很关键否则同一个文件会被处理两遍Linux 上则能同时匹配到两种后缀。4. 退出码脚本用sys.exit(0/1)返回退出码方便在CI、批处理脚本里判断执行结果python asc_to_blf.py D:\can_logsif%errorlevel% neq0(echo转换失败请检查日志)六、小结核心就两步can.ASCReader读 →can.BLFWriter写支持单文件 / 目录批量两种模式覆盖日常绝大多数场景代码短、零配置丢到日志目录里双击运行就能用。相关文章推荐python-can 官方文档https://python-can.readthedocs.io/BLF 格式说明Vector Binary Logging Format
RELATED

相关推荐

3 款手机音频剪辑 APP 横评,短视频配音后期,免费工具怎么选?

3 款手机音频剪辑 APP 横评,短视频配音后期,免费工具怎么选?

不少做短视频、录制播客的朋友,不想在电脑操作专业音频软件,会尝试在手机上处理音频素材。各类音频剪辑工具比较多,部分软件功能受限,还有一些会设置付费门槛。本次为个人体验测试,分享三款工具的实际使用感受&#xf…

📅 2026/10/11 6:25:44
操作系统级验证能力下沉:从内核KCSAN到eBPF自定义规则

操作系统级验证能力下沉:从内核KCSAN到eBPF自定义规则

1. 项目概述:当“写代码”不再是终点,而“验代码”成了新门槛最近在几个技术社区和内部分享会上,我反复听到一个说法:“现在招人,不看你能写多少行代码,而是看你能不能一眼揪出那行藏得最深的逻辑漏洞。”这…

📅 2026/10/11 6:20:44
Laya 在 Hermes Agent 中安装与使用

Laya 在 Hermes Agent 中安装与使用

范围:记录 Laya System 1 决策模型在 Hermes Agent 中的完整落地链路——本地安装、MCP 配置、工具实测、踩坑记录,以及"一次聊天中如何决定是否调用 Laya"的机制分析。1. 为什么是 Laya Hermes Agent Laya 是非自回归 System 1 决策引擎&…

📅 2026/10/11 6:20:44
MORE NEWS

更多资讯

📰

AnyPS5跨平台串流工具:架构解析与实操指南

1. 从“AnyPS5”这个标题说起:一个跨平台串流工具的设计初衷第一次看到“AnyPS5”这个标题,我脑子里蹦出来的第一个念头是:这大概率又是一个折腾远程串流的项目。果不其然,翻了一圈社区讨论和零散的代码片段之后,基本可…

📰

如何不被自媒体干扰,真正地独立思考

不论是刷小红书还是刷 X,我们总是能看到各种热点新闻:“小龙虾风靡全球”“ChatGPT 发布史上最强模型”“某某模型打败了所有竞争对手”……现在的信息传播非常快,一个新产品刚刚发布,可能还没来得及仔细了解它,互联网…

📰

GitHub 热榜连续一周霸榜的 AI 智能体工具层:技能包、MCP 服务与上下文压缩三条路线

GitHub 热榜连续一周霸榜的 AI 智能体工具层:技能包、MCP 服务与上下文压缩三条路线 开篇:一周日榜说明了什么,又没有说明什么 2026 年 10 月 2 日至 10 月 8 日这一周,GitHub 日榜上最密集的一类项目不是新的模型、新的框架&…

📰

鄂州红莲湖固化,地坪抗渗耐磨-福阔地坪

福阔地坪环氧自流平:给爱家增添色彩的艺术涂料选择 在快节奏生活的今天,我们每一个人内心深处都有一片渴望安静下来的天地,在那里可以尽情享受家的温暖与美好。而随着人们对生活品质追求不断提升,“个性化”“舒适度”和“安全环保…

📰

财务智能体选型:先找高频重复,还是先找高价值场景?

选错第一个场景,可能让整个项目死在起跑线上。财务智能体立项时,团队通常会分成两派。 一派主张从高频重复的场景切入:发票识别、报销审核、银企对账,这些工作每天发生、规则明确、人工耗时巨大,上线后效果立竿见影。另…

📰

Spring Boot+Vue+AI预测:电竞赛事中心全栈项目实战

做这个项目,最初是因为看比赛的时候总喜欢猜谁赢,弹幕上也是一堆人问“这波谁能赢”“打野差距太大了”。后来想着,与其口头争论,不如干脆把“AI预测赛事结果”这件事做成一个正经的系统。于是就有了这套电竞赛事中心:…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬