You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python遍历文本事件列表:查找failure后同节点指定PID直到对应finish

Python 事件日志遍历解决方案

输入数据格式

事件日志文本结构如下:

ln  pid description
1   23  failure in node 5
2   23  restart node 5
3   26  check node 5
4   30  fault alarm in node 10
5   23  finish
..  ..  ..

需求目标

  1. 定位包含指定进程ID(如23)对应节点(如node 5)的failure事件行
  2. 从该failure行的下一行开始遍历,检查是否存在pid=26访问同一节点的记录,且该记录必须出现在同一pid=23的finish事件之前

实现思路与代码

使用enumerate获取行索引,找到目标failure行后,通过while循环从下一行开始遍历,直到遇到目标pid的finish行:

# 示例日志数据(可替换为实际读取的文本行列表)
event_log = [
    "1   23  failure in node 5",
    "2   23  restart node 5",
    "3   26  check node 5",
    "4   30  fault alarm in node 10",
    "5   23  finish",
    "6   23  failure in node 7",
    "7   26  check node 8",
    "8   23  finish"
]

import re

for line_idx, line in enumerate(event_log):
    # 拆分每行内容,跳过格式异常行
    line_parts = line.strip().split()
    if len(line_parts) < 3:
        continue
    
    current_pid = line_parts[1]
    description = " ".join(line_parts[2:])
    
    # 匹配目标pid的failure事件
    if current_pid == "23" and "failure" in description:
        # 提取事件对应的节点
        node_match = re.search(r'node (\d+)', description)
        if not node_match:
            continue
        target_node = f"node {node_match.group(1)}"
        target_finish_pid = "23"
        check_target_pid = "26"
        
        match_found = False
        next_line_idx = line_idx + 1
        
        # 从下一行开始遍历,直到找到finish行或遍历结束
        while next_line_idx < len(event_log):
            current_check_line = event_log[next_line_idx]
            check_parts = current_check_line.strip().split()
            
            if len(check_parts) < 3:
                next_line_idx += 1
                continue
            
            check_pid = check_parts[1]
            check_desc = " ".join(check_parts[2:])
            
            # 先检查是否到达目标pid的finish行,到达则终止遍历
            if check_pid == target_finish_pid and "finish" in check_desc:
                break
            
            # 检查是否是指定pid访问目标节点的记录
            if check_pid == check_target_pid and target_node in check_desc:
                match_found = True
                print(f"匹配成功:{current_check_line}")
                break
            
            next_line_idx += 1
        
        if not match_found:
            print(f"pid={target_finish_pid}的finish行前,未找到pid={check_target_pid}访问{target_node}的记录")

代码说明

  • 通过enumerate获取行索引,精准定位failure行的位置
  • 使用while循环从failure行的下一行开始遍历,避免重复扫描整个列表
  • 遍历过程中优先判断是否遇到目标pid的finish行,确保只检查有效的区间
  • 用正则表达式提取节点信息,提升代码的通用性,无需硬编码节点编号

内容的提问来源于stack exchange,提问作者Adam Barret

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:15:31