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

