查找日志文件中字符串出现的次数;
# 统计字符串的次数
def findStr(str, filePath):
with open(filePath, 'r') as f:
counts = 0
for line in f.readlines():
time = line.count(str)
counts += time
print("%s出现的次数:%d" % (str, counts))
return counts
# 匹配的字符串
str_ct = "Msfl run once consumed time"
str_ft = "filtering time"
filePath = r'E:\2024-04-27-11-13-14\localization_ros_x86_64.ubuntu2004.invalid-user.log.INFO.20240429-073803.3899'
count_ct = findStr(str_ct, filePath)
count_ft = findStr(str_ft, filePath)
print("总的融合次数:", count_ft, "次,超过10ms的融合次数:", count_ct, "次,10ms内融合次数占比:",
round((count_ft - count_ct) / count_ft * 100, 2), "%")
根据需要进行拓展
# 统计字符串的次数
from datetime import datetime
import os
import re
def findStr(str, filePath):
with open(filePath, 'r') as f:
counts = 0
for line in f.readlines():
time = line.count(str)
counts += time
print("%s匹配次数:%d;" % (str, counts))
return counts
# 匹配的字符串
# 原始gnss数据
str_origin = "origin gnss data"
# 点云数据
str_cloud = "received cloud message"
# 多源融合时间
str_ft = "filtering time"
# 多源融合超过10ms
str_msfl = "Msfl run once consumed time"
# 激光雷达,Correct by lidar odometry. is_fusion_succeeded = 1, filtering time:1666841933.607384, laser odom time: 1666841933.478789
str_lidar = "laser odom time"
# ins车速融合,CorrectLocalization = 1, filtering time: 1666841933.833645, vehicle speed time: 1666841933.833645, vehicle speed: 0.002640
str_vehicle = "vehicle speed time"
# gnss融合,CorrectLocalization = 1, filtering time:1666841933.397890, gnss time: 1666841933.397890
str_gnss = "gnss time"
# 视觉融合,CorrectLocalization = 1, filtering time:1666841933.397890, visual time: 1666841933.397890
str_visual = "visual time"
# 激光雷达扫描匹配耗时,lidar locator scan match consume time: 119.188 ms
str_lidar_consume = "lidar locator scan match consume time"
# str_lidar_consume_end = "ms"
filePath = r'E:\20200127224930\localization.ubuntu2004.root.log.INFO.20240528-023802.651'
# 统计关键字匹配次数
count_origin = findStr(str_origin, filePath)
count_cloud = findStr(str_cloud, filePath)
count_msfl = findStr(str_msfl, filePath)
count_ft = findStr(str_ft, filePath)
count_lidar = findStr(str_lidar, filePath)
count_vehicle = findStr(str_vehicle, filePath)
count_gnss = findStr(str_gnss, filePath)
count_visual = findStr(str_visual, filePath)
count_lidar_consume = findStr(str_lidar_consume, filePath)
rate = round((count_ft - count_msfl) / count_ft * 100, 4)
# 统计激光雷达扫描、融合解算的耗时
def consumed_time(filePath, pattern):
results = []
with open(filePath, 'r') as file:
for line in file:
# 首尾关键词匹配
if pattern in line:
# 以空格隔断,把倒数第二列的耗时,添加到列表中
col = line.split(' ')
results.append(float(col[-2]))
return results
# 激光雷达扫描耗时
lidar_consumed = consumed_time(filePath, str_lidar_consume)
average_lidar = round(sum(lidar_consumed) / len(lidar_consumed), 4)
max_value_lidar = max(lidar_consumed)
min_value_lidar = min(lidar_consumed)
count_50p_lidar = 0
for dt in lidar_consumed:
if dt >= 50:
count_50p_lidar += 1
rate_50p_lidar = round(count_50p_lidar / len(lidar_consumed) * 100, 4)
# 融合解算耗时
msfl_consumed = consumed_time(filePath, str_msfl)
average_msfl = round(sum(msfl_consumed) / len(msfl_consumed), 4)
max_value_msfl = max(msfl_consumed)
min_value_msfl = min(msfl_consumed)
count_50p_msfl = 0
for dt in msfl_consumed:
if dt >= 50:
count_50p_msfl += 1
rate_50p_msfl = round(count_50p_msfl / len(msfl_consumed) * 100, 4)
# 存放文件
file_dir = os.path.dirname(filePath)
t = datetime.now().strftime("%m%d%H%M")
target_path = os.path.join(file_dir, '统计融合时间&次数_' + t + '.txt')
with open(target_path, 'w') as resultfile:
result = f"原始gnss数据:{count_origin}条,点云数据:{count_cloud}条;" + '\n' + \
f"激光雷达扫描匹配:{count_lidar_consume}次,超过50ms耗时占比:{rate_50p_lidar}%,其中平均耗时:{average_lidar}ms,最小耗时:{min_value_lidar}ms,最大耗时:{max_value_lidar}ms;" + '\n' + \
"激光雷达融合次数:%d次,ins车速融合次数:%d次,gnss融合次数:%d次,visual视觉融合次数:%d次;" % (
count_lidar, count_vehicle, count_gnss, count_visual) + '\n' + "总的融合次数:" + str(
count_ft) + "次,融合耗时10ms内占比:" + str(rate) + "%,融合耗时超过10ms的次数:" + str(
count_msfl) + "次,其中平均耗时:" + str(average_msfl) + "ms,最小耗时:" + str(int(
min_value_msfl)) + "ms,最大耗时:" + str(int(max_value_msfl)) + "ms。"
print(result)
resultfile.writelines(result)