使用Python过滤CAN总线报文 按标识符筛选的实现方法咨询
CAN总线日志按标识符过滤实现方案
你原有代码存在几个可优化的点:
- 每次循环重复打开文件未关闭,长期运行会导致文件句柄泄漏
- 每次全量读取整个文件,日志文件体积变大后性能会越来越差
- 仅打印倒数第二行,容易漏过多行同时写入的新日志,也没有过滤逻辑
最终实现代码
# 可直接修改下方参数适配需求 LOG_FILE = "test.txt" TARGET_ID = "0000155" # 要过滤的目标报文标识符 def follow_log(file_path): # 用with语句自动管理文件开闭,避免句柄泄漏 with open(file_path, 'r') as f: # 若需要启动时先过滤所有历史日志,删除下一行f.seek代码即可 f.seek(0, 2) # 直接跳到文件末尾,仅处理程序启动后新写入的日志 while True: line = f.readline() if not line: # 无新内容时短暂休眠,降低CPU占用 import time time.sleep(0.1) continue yield line.strip() if __name__ == "__main__": for line in follow_log(LOG_FILE): parts = line.split('|') # 跳过格式不符合规则的异常行 if len(parts) != 3: continue _, msg_id, _ = parts if msg_id == TARGET_ID: print(line)
内容的提问来源于stack exchange,提问作者KZwin
相关产品推荐
相关产品推荐

