本章分享一点实用的东西,读取log文件,并做筛选,提取想要的数据。
思路提供者:liuxingyuvs.top
前言
本章为实用部分,涵盖多个基础知识点。
log数据如下:
log 4 4 # ------info(111.855)------ <charge> vl : 458 mv cr : 0 ma <warn> wv : 0 bp : 0 op : 0 cp : 0 <work> tt : 0 al : 0 tt : 0 go : 0 hl : 0 bt : 0 <batterry> vl : 11346 mv cr : 1054 ma cp : 66 % tr : 11.96 w <motor> vl : 8093 mv cr : 960 ma dv : pwr dy : 71.33 % mr : 10.89 w status : forward <water> in : 1138 mv water_status: 2 wp : 0.00 w wp : 0.00 w <hall> count : 0 status : 1 <ic> br : 0 cr : 0 <qmi8658> error : 0 <temperature> pt : 27.9 °C bt : 26.7 °C <board> v3 : 3289 mv v5 : 4931 mv v9 : 3026 mv en : 1 ------info(112.431)------ <charge> vl : 457 mv cr : 0 ma <warn> wv : 0 bp : 0 op : 0 cp : 0 <work> tt : 0 al : 0 tt : 0 go : 0 hl : 0 bt : 0 <batterry> vl : 11327 mv cr : 1194 ma cp : 66 % tr : 13.52 w <motor> vl : 10826 mv cr : 1240 ma dv : pwr dy : 95.58 % mr : 14.05 w status : forward <water> in : 615 mv water_status: 2 wp : 0.00 w wp : 0.00 w <hall> ct : 0 ss : 1 <i2c> br : 0 cr : 0 <qmi8658> error : 0 <temperature> pt : 28.1 °C bt : 26.8 °C <board> v3 : 3289 mv v5 : 4932 mv v9 : 6499 mv en : 1
「需求:取出change下的两个参数」
方法一
with open("11.log",'r',encoding='utf-8') as r: for values in r: # print(values.strip().replace('\n','')) if 'charge' in values: for i in range(2): value = r.readline().strip() # value = r.readlines(15) print(value) # str_ = ''.join(value) # print(str_)
里面写了两种,一种是基于line,另一种基于lines。
lines的写法看看就行,实际切不可采取使用这样的方式。
方法二
还是用的字符串处理方式,跟上述有些不太一样。主要用的是分割以及下标取值
with open("11.log",'r',encoding='utf-8') as r: res = r.read() charge_data = res.split("<charge>") # 取出 charge 数据部分并按行划分 for value in charge_data: vl = value.split("\n")[1] cr = value.split("\n")[2] if len(vl or cr) < 3: continue print(vl) print(cr)
方法三
正则提取
import re with open("11.log",'r',encoding='utf-8') as r: data = r.read() find_str = '<work>' matches = re.findall(r'{}\n(.*?)\n(.*?)\n'.format(find_str), data) for match in matches: vl, cr = match print(vl) print(cr)
方法四
还是字符串匹配。
with open('11.log', 'r') as f: s = f.read() start = '<work>\n' end = '\n<batterry>' start_idx = s.find(start) while start_idx != -1: end_idx = s.find(end, start_idx) if end_idx != -1: data = s[start_idx + len(start):end_idx].strip() print(data) start_idx = s.find(start, end_idx) else: break