Python實(shí)現(xiàn)批量提取BLF文件時(shí)間戳
在汽車(chē)測(cè)試、嵌入式系統(tǒng)開(kāi)發(fā)等領(lǐng)域,CAN 總線(xiàn)數(shù)據(jù)的分析是一項(xiàng)基礎(chǔ)且關(guān)鍵的工作。而 BLF(Binary Logging Format)作為 Vector 公司推出的 CAN 總線(xiàn)數(shù)據(jù)記錄格式,被廣泛用于存儲(chǔ)車(chē)輛通信數(shù)據(jù)。本文將通過(guò)一段實(shí)用的 Python 代碼,帶你掌握批量處理 BLF 文件的技巧,輕松提取關(guān)鍵時(shí)間戳信息并生成結(jié)構(gòu)化數(shù)據(jù)報(bào)告。
一、為什么需要批量處理 BLF 文件
在汽車(chē)測(cè)試場(chǎng)景中,一臺(tái)測(cè)試設(shè)備可能在單次實(shí)驗(yàn)中生成成百上千個(gè) BLF 文件,每個(gè)文件包含數(shù)萬(wàn)條 CAN 消息。手動(dòng)分析這些文件不僅效率低下,還容易出錯(cuò)。通過(guò)編程批量處理,我們可以:
- 快速提取文件創(chuàng)建時(shí)間、消息起止時(shí)間等關(guān)鍵時(shí)序信息
- 生成標(biāo)準(zhǔn)化的 CSV 報(bào)告,便于后續(xù)數(shù)據(jù)分析
- 自動(dòng)化校驗(yàn)數(shù)據(jù)完整性(如消息時(shí)間連續(xù)性)
- 為大數(shù)據(jù)分析或 AI 模型訓(xùn)練提供結(jié)構(gòu)化輸入
二、核心代碼解析:從文件遍歷到數(shù)據(jù)導(dǎo)出
1. 環(huán)境準(zhǔn)備與依賴(lài)庫(kù)
這段代碼依賴(lài)兩個(gè)核心庫(kù):
python-can
:用于解析 BLF 文件的專(zhuān)業(yè)庫(kù),需通過(guò)pip install python-can
安裝- 標(biāo)準(zhǔn)庫(kù):
os
(路徑處理)、csv
(數(shù)據(jù)導(dǎo)出)、datetime
(時(shí)間處理)
2. 核心功能模塊詳解
(1)BLF 文件路徑掃描器
def get_blf_files(dataset_path: str): blf_files = [] for d in os.listdir(dataset_path): can_path = os.path.join(dataset_path, d, 'canbus') if not os.path.exists(can_path): continue for v in os.listdir(can_path): if not v.endswith(blf_extension): continue blf_path = os.path.join(can_path, v) blf_files.append(blf_path) return blf_files
功能解析:
- 遍歷目標(biāo)目錄下的
canbus
子文件夾(汽車(chē)數(shù)據(jù)常見(jiàn)存儲(chǔ)結(jié)構(gòu)) - 篩選出所有
.blf
后綴的文件 - 返回完整文件路徑列表,為后續(xù)解析做準(zhǔn)備
(2)時(shí)間戳信息提取器
def get_blf_info(blf_path: str): file_name = os.path.basename(blf_path).replace('.blf', '') start_time = datetime.strptime(file_name, '%Y%m%d%H%M%S') file_timestamp = start_time.timestamp() with can.BLFReader(blf_path) as reader: start_timestamp = reader.start_timestamp stop_timestamp = reader.stop_timestamp messages = [msg for msg in reader] first_message_timestamp = messages[0].timestamp last_message_timestamp = messages[-1].timestamp return file_timestamp, start_timestamp, stop_timestamp, first_message_timestamp, last_message_timestamp
核心亮點(diǎn):
- 從文件名提取創(chuàng)建時(shí)間(假設(shè)文件名格式為
%Y%m%d%H%M%S
) - 通過(guò)
can.BLFReader
讀取 BLF 文件元數(shù)據(jù)(start_timestamp
/stop_timestamp
) - 提取首條和末條 CAN 消息的時(shí)間戳,用于分析數(shù)據(jù)覆蓋范圍
- 返回五種關(guān)鍵時(shí)間戳,構(gòu)建完整的時(shí)序鏈條
(3)數(shù)據(jù)導(dǎo)出與主流程控制
主函數(shù)實(shí)現(xiàn)了 “掃描 - 解析 - 導(dǎo)出” 的全流程:
root_path = r"can/path" files = get_blf_files(root_path) with open(f'{output_file_name}.csv', mode='w') as csv_f: writer = csv.writer(csv_f) for f in files: timestamps = get_blf_info(f) writer.writerow(timestamps)
三、實(shí)戰(zhàn)應(yīng)用:如何使用這段代碼
環(huán)境配置:
pip install python-can
路徑設(shè)置:
修改root_path
為你的 BLF 文件根目錄(支持嵌套的canbus
子文件夾)
運(yùn)行代碼:
執(zhí)行后會(huì)在當(dāng)前目錄生成以根目錄名為文件名的 CSV 文件,包含五列時(shí)間戳數(shù)據(jù):
- 文件名稱(chēng)時(shí)間戳
- 文件元數(shù)據(jù)開(kāi)始時(shí)間
- 文件元數(shù)據(jù)結(jié)束時(shí)間
- 首條消息時(shí)間戳
- 末條消息時(shí)間戳
數(shù)據(jù)校驗(yàn)示例:
通過(guò)對(duì)比first_message_timestamp
與file_timestamp
,可快速檢查文件命名是否與實(shí)際消息時(shí)間一致,排查數(shù)據(jù)錯(cuò)位問(wèn)題。
四、優(yōu)化建議與擴(kuò)展方向
性能優(yōu)化:
對(duì)于十萬(wàn)級(jí)文件處理,可改用os.scandir
替代os.listdir
提升路徑掃描效率,或引入多線(xiàn)程并行解析。
異常處理:
增加try-except
塊處理?yè)p壞的 BLF 文件或格式錯(cuò)誤的文件名:
try: start_time = datetime.strptime(file_name, '%Y%m%d%H%M%S') except ValueError: print(f"無(wú)效文件名格式:{file_name}") continue
功能擴(kuò)展:
- 增加 CAN 消息 ID 統(tǒng)計(jì)功能,分析高頻通信節(jié)點(diǎn)
- 計(jì)算消息間隔時(shí)間,檢測(cè)總線(xiàn)負(fù)載峰值
- 結(jié)合
pandas
生成可視化時(shí)序圖表
五、總結(jié)
這段代碼為 CAN 總線(xiàn)數(shù)據(jù)處理提供了基礎(chǔ)但實(shí)用的工具鏈,特別適合汽車(chē)測(cè)試工程師、嵌入式開(kāi)發(fā)者快速完成 BLF 文件的批量解析工作。通過(guò)將非結(jié)構(gòu)化的二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為結(jié)構(gòu)化的 CSV 表格,為后續(xù)的數(shù)據(jù)分析、可視化和建模鋪平了道路。
如果你在使用中需要處理其他格式的 CAN 數(shù)據(jù)(如.asc
、.log
),可以嘗試基于python-can
庫(kù)的其他 Reader 類(lèi)進(jìn)行擴(kuò)展,原理與本文的 BLF 處理邏輯相似。掌握這種批量處理思維,能讓你在面對(duì)海量工業(yè)數(shù)據(jù)時(shí)更游刃有余。
到此這篇關(guān)于Python實(shí)現(xiàn)批量提取BLF文件時(shí)間戳的文章就介紹到這了,更多相關(guān)Python提取BLF文件時(shí)間戳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)讀取類(lèi)別頻數(shù)數(shù)據(jù)畫(huà)水平條形圖案例
這篇文章主要介紹了python實(shí)現(xiàn)讀取類(lèi)別頻數(shù)數(shù)據(jù)畫(huà)水平條形圖案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04用Python解析身份證號(hào)獲取年齡和性別的實(shí)現(xiàn)方法
身份證號(hào)碼包含了豐富的信息,包括生日和性別,Python提供了處理和解析身份證號(hào)的功能,讓我們能夠從中提取出相關(guān)的信息,本文將介紹如何利用Python解析身份證號(hào),獲取持有者的年齡和性別信息,感興趣的朋友可以參考下2023-12-12python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖
這篇文章主要介紹了python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖,詳細(xì)的內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容2022-08-08