如何在统计日志中指定条目时间总和时排除后续行含特定字符串的目标行
如何在统计日志中指定条目时间总和时排除后续行含特定字符串的目标行
嘿,这个需求其实就是要我们结合前后行的关联信息来做过滤,原来的单行处理逻辑没法做到这一点,我们可以换个思路,先把所有日志行读进来,然后遍历的时候同时检查下一行的内容,判断要不要把当前行计入总和。
核心思路
我们需要:
- 先把所有日志行加载到列表里,方便随时访问下一行的内容
- 遍历每一行时,如果当前行是我们要统计的
df vj and vk,就检查它的下一行是否包含density fitting ao2mo - 只有当下一行不包含这个排除字符串时,才把当前行的时间值加入总和;如果是最后一行,直接计入(因为没有后续行需要排除)
具体实现代码
针对你的需求,这里给出可以直接用的代码:
file_name = "你的日志文件路径.txt" target_param = "df vj and vk" exclude_followed_by = "density fitting ao2mo" # 这里的position对应wall time的位置,根据你的日志格式调整 # 比如你的日志行split后,wall time的数值在第11个索引(从0开始数) position = 11 # 读取所有行并过滤空行 with open(file_name, 'r') as f: lines = [line.strip() for line in f if line.strip()] total = 0.0 # 遍历每一行,检查当前行与下一行的关系 for i in range(len(lines)): current_line = lines[i] if target_param in current_line: # 不是最后一行的话,检查下一行内容 if i < len(lines) - 1: next_line = lines[i+1] if exclude_followed_by not in next_line: total += float(current_line.split()[position]) else: # 最后一行直接计入 total += float(current_line.split()[position]) print(f"df vj and vk 的总wall时间(已排除指定行):{total}")
运行这段代码后,就能得到你想要的41.82271这个结果啦。
通用封装(方便复用)
如果你需要统计多个参数,可以把逻辑封装成一个函数,这样更灵活:
def calculate_filtered_total(file_name, target_param, exclude_followed_by, position): """ 统计日志中目标参数的时间总和,排除后续行含指定字符串的目标行 :param file_name: 日志文件路径 :param target_param: 要统计的目标参数字符串 :param exclude_followed_by: 需要排除的后续行包含的字符串 :param position: 时间数值在split后的行列表中的索引 :return: 过滤后的总时间 """ with open(file_name, 'r') as f: lines = [line.strip() for line in f if line.strip()] total = 0.0 for i in range(len(lines)): current_line = lines[i] if target_param in current_line: if i < len(lines) - 1: if exclude_followed_by not in lines[i+1]: total += float(current_line.split()[position]) else: total += float(current_line.split()[position]) return total # 调用示例 wall_time_position = 11 df_total = calculate_filtered_total("你的日志文件路径.txt", "df vj and vk", "density fitting ao2mo", wall_time_position) print(f"df vj and vk 总wall时间:{df_total}")
注意事项
- 确保
position的数值正确:因为split()会自动合并多个空格/制表符,所以你可以先打印某一行的split()结果,找到对应时间数值的索引 - 如果需要排除多种后续行,可以把
exclude_followed_by改成一个列表,然后判断any(phrase in next_line for phrase in exclude_followed_by) - 代码里过滤了空行,避免日志中的空行干扰判断
备注:内容来源于stack exchange,提问作者Valay Agarawal
相关产品推荐
相关产品推荐

