python拆分CANLog
通过CANOE 导出的log通常有很多个ID的数据,如何才能找到某一个ID下的特殊的信号?利用python可以简单的进行这个步骤,代码如下:
说明:
最终的效果是将log信息,分不同的ID进行拆分,并单独生成文件log_id.csv的文件夹。
1. 需要输入输入文件夹
2. 生成_out文件夹。
3. 没有错误处理
4. 采用"[A-F|\d]{3}"匹配CAN ID
#log analy about CAN Signal for CANOE
import os
import re ID_Info = {}
fold_in = input("Please input Folder In:")
fold_out = fold_in + "_out"
os.mkdir(fold_out)
rep_id = r"[A-F|\d]{3}"
patt_id = re.compile(rep_id)
def Info_Report():
'''
CAN Log中的信息有固定的位数。
0:时间戳
1:1/2
2:ID
3:Rx/Tx
4: d
5: data Length
6: data length number info
'''
pass def Dev_Folder(folder_in):
for fi in os.listdir(folder_in):
#打开文件
with open(os.path.join(folder_in,fi),"r") as file:
#遍历文件行
for line in file:
#拆分文件,去掉空格,去掉前后逗号
a = re.sub('\s+',',',line).strip(",")
#判断List是否有3个以上的元素,并且第3个是否为ID.
if len(a.split(",")) > 2 and patt_id.match(a.split(",")[2]):
if a.split(",")[2] in ID_Info.keys():
#如果在字典中,直接将信息写入到该文件中
pass
else:
#新建一个文件,关联字典
ID_Info[a.split(",")[2]] = open((os.path.join(fold_out + "\\" + "Log_" + a.split(",")[2]) + ".csv"),"w")
ID_Info[a.split(",")[2]].write(a+"\n")
#print(a.split(",")[0])
for key in ID_Info:
ID_Info[key].close() if __name__ == '__main__':
Dev_Folder(fold_in)
以上拆分为单个的ID了,那么如何找到某一个信号的值呢?可以通过下面的代码进行计算:
'''
CANOE Log
'''
''' '''
start_bit = 0
data_length = 0
can_mode = 0 def Info_Report():
'''
Need Input This information about CAN setting.
start bit: start_bit
Length : Data_Length
start bit mode : LSB(0)/MSB(1)
default:LSB(0)
'''
pass def SetBit(start,length,mode = 0):
'''
for Get Info or set info
'''
start_bit = start
data_length = length
can_mode = mode def Analyse_ID_File(File_Input_Name,File_Output_Name):
'''
Analyse id for Every ID Signal
'''
#open file
file_out = open(File_Output_Name,"w")
with open(File_Input_Name,"r") as file:
for line in file:
#拆分每一行,放入到list中
data_list = line.split(",")
data_length = int(data_list[5],16)
list_in = data_list[6:6+data_length]
data_signal = Find_FromList(list_in)
file_out.write(data_list[0]+","+str(data_signal)+"\n")
file_out.close() def Find_FromList(data_list):
dataMerge = ''
a,b,c = Find_StartEnd(start_bit,data_length,can_mode)
#print(data_list)
if len(data_list) > b:
for i in range(a,b+1):
#print(i)
dataMerge = dataMerge + data_list[i]
#print(dataMerge)
data_Digit = (int(dataMerge,16)>>c) & ((1<<(data_length))-1)
return (data_Digit)
#print(dataMerge) def Find_StartEnd(start,length,mode):
'''
This Function return value:
byte_little,byte_big,bigbyte_bit
'''
startbyte = start >> 3
startbit = start % 8
if mode == 0:
litByte = startbyte - ((startbit+length-1)>>3)
BigByte = startbyte
Endbit = startbit
else:
pass
return (litByte,BigByte,Endbit) if __name__ == '__main__':
#print(Find_StartEnd(32,20,1))
file_name = input("Please input file You need Analyse:")
file_out_name = input("Please input file You need Out(.csv):")
start_bit,data_length,can_mode = map(int,input("please input can info(start_bit,data_length,can_mode(0/1),PV为0):").split(","))
Analyse_ID_File(file_name,file_out_name)
以上,如果不通过导入每个信号信息含义的话,是可以快速的找到某个信号在整个log中的值得变化的。
以上,只支持以LSB开始,计算长度的算法。如果以MSB需要在''Find_StartEnd"函数中增加''mode == 1''的处理。
python拆分CANLog的更多相关文章
- python拆分excel脚本
因为需要将一个很大的excel按500条拆分为多个excel,手工操作实在太麻烦,就写了个python小脚本,现在是分为了多个sheet页,使用者可根据自己实际情况修改成多个文件的形式 #!/usr/ ...
- Python 拆分字符串
数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list ...
- Python拆分DataFrame
# 在Python中可以根据某列的具体内容来拆分数据,保存成多个DataFrame! # 代码如下: ycsj = pfsj[pfsj['备注'].isin(['1'])] # 拆分数据: 结果:
- 使用Python拆分数据量大的CSV文件(亲测有效)
转载:https://www.cnblogs.com/FYZHANG/p/11629075.html 一次就运行成功了,感谢博主分享 #!/usr/bin/env python3 # -*- # @F ...
- python 拆分字符串(3.0)
拆分字符串 1. def my_split(s, ds): l = [s] for d in ds: res = [] list(map(lambda x: res.extend(x.split(d) ...
- Python拆分一列为多列
有的员工,没有公司开户行的银行卡,发放现金工资.有时人多,需要计算币数.现金工资表中,其中一列为实发工资,import pandas as pd,转化为pd.DataFrame. 面值[100,50, ...
- python 奇偶拆分list,python拆分list,得到一个原来list的奇数list,一个原来list的偶数list
需求:现在有一个list ,range_data = ['m', 'M', 'h', 'c', 'X', 'Z', 'A', 'o'] 希望得到两个list, 一个是奇数list =['m', 'h ...
- python 小程序大文件的拆分合并
1. 将大文件拆分为小文件 I 通过二进制的方式将大文件读取出来,将其拆分存,以不同的文件方式存放在一个目录下面 II 提供两种操作方式交互式和命令行模式 #! usr/bin/python # -* ...
- python split()函数使用拆分字符串 将字符串转化为列表
函数:split()Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list ...
随机推荐
- [LeetCode] Minimum Moves to Equal Array Elements 最少移动次数使数组元素相等
Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...
- [LeetCode] Integer to English Words 整数转为英文单词
Convert a non-negative integer to its english words representation. Given input is guaranteed to be ...
- [LeetCode] Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- js整理
Js脚本语音 网页里面使用的脚本语音 基础语法 注释语法 单行注释// 多行注释/**/ 嵌入js代码 尽量靠下写 用<script type="text/javascript& ...
- uva10635 LIS
Prince and PrincessInput: Standard Input Output: Standard Output Time Limit: 3 Seconds In an n x n c ...
- OC中的多继承
可以间接实现,方法有: 1.消息转发 2.协议 3.组合模式 4.代理 5.分类 直接上code,分别说明集中方法的实现 一.消息转发 消息转发可以参考我的另外一篇博客:http://www.cnbl ...
- JsonResult类设置返回json的长度(工作笔记 json转化出错)
public JsonResult PoundageReportSearch() { JsonResult jr = new JsonResult(); // 实例 ...
- 微信Api分享
这些都是以前积累的东西,有很多都是参考了别人的,都忘记出处了,请大家谅解.参考微信开发者平台 https://open.weixin.qq.com/cgi-bin/showdocument?actio ...
- document.domain
HTML DOM DOCUMENT 对象 定义和用法 domain 属性可返回下载当前文档的服务器域名. 语法 document.domain 说明 该属性是一个只读的字符串,包含了载入当前文档的 w ...
- CodeForces 24D Broken Robot
题意:n*m的棋盘,一个机器人在(i,j)处,每次等概率地停在原地,向左移动一格,向右移动一格,向下移动一格(不能移出棋盘).求走到最后一行所需期望步数.n<=1000,m<=1000 一 ...