Python文件解析:匹配双模式时输出前后指定行数的方法
实现可配置前后行数的文件内容提取
需求说明
假设目标文件内容如下:
line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15
需要提取line6和line9之间的内容,同时包含起始模式前2行和结束模式后2行,期望输出:
line4 line5 line6 line7 line8 line9 line10 line11
现有代码仅能提取两个模式之间的内容:
first_pattern = "line6" last_pattern = "line9" with open(file, "r") as f: inside_region = False for line in f: if first_pattern in line: inside_region = True if inside_region: print(line) # Printing the lines between two patterns if last_pattern in line: inside_region = False break
修改后的实现代码
我们可以用滑动窗口缓冲区保存最近的指定行数,同时跟踪输出状态,实现可配置的前后行数扩展:
from collections import deque first_pattern = "line6" last_pattern = "line9" lines_before_after = 2 # 可配置的前后扩展行数 file_path = "your_file.txt" # 替换为你的实际文件路径 with open(file_path, "r") as f: # 用deque维护固定长度的滑动窗口,自动丢弃超出长度的最早行 pre_buffer = deque(maxlen=lines_before_after) inside_region = False post_remaining = 0 for line in f: line = line.rstrip('\n') # 可选:去除换行符,避免重复输出空行 if not inside_region: pre_buffer.append(line) # 匹配到起始模式时,切换状态并输出前置缓冲区内容 if first_pattern in line: inside_region = True for buf_line in pre_buffer: print(buf_line) else: # 处于目标区域内,直接输出当前行 print(line) # 匹配到结束模式时,开启后置行数计数 if last_pattern in line: post_remaining = lines_before_after inside_region = False # 处理结束模式后的指定行数输出 if post_remaining > 0: print(line) post_remaining -= 1 # 输出完后置行数后终止遍历 if post_remaining == 0: break
代码说明
- 前置缓冲区:通过
deque的固定长度特性,自动维护最近的lines_before_after行,找到起始模式时一次性输出这些前置内容。 - 状态切换:用
inside_region标记是否处于两个模式之间的核心区域,处于该区域时直接输出每行内容。 - 后置行数控制:匹配到结束模式后,通过
post_remaining计数,继续输出后续指定行数的内容,完成后立即停止文件遍历,提升大文件处理效率。 - 灵活配置:只需修改
lines_before_after的数值,即可快速调整前后扩展的行数,适配不同场景需求。
内容的提问来源于stack exchange,提问作者2auri
相关产品推荐
相关产品推荐

