本章分享一点实用的东西,读取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