Python基础知识综合运用-学习版

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

猜你喜欢

转载自blog.csdn.net/weixin_52040868/article/details/129458019