如何获取文件中匹配行的前后5行?Python文本处理技术求助
解决方案:用滑动队列维护上下文行
这问题我之前处理大日志文件时也碰到过——直接逐行读确实拿不到前面的上下文,而且你原来的代码还有个小坑:用五次next(infile)会跳过那五行,如果里面刚好有另一个匹配行,就会直接漏掉!
给你个高效的解决方案,用滑动队列来维护最近的5行,既不占太多内存(完全适合2万行甚至更大的文件),还能正确拿到前后上下文:
from collections import deque search_string = 'Name' context_count = 5 # 统一设置前后需要获取的行数 with open('test.txt', 'r') as infile, open('textOut.txt', 'w') as outfile: # 初始化固定长度队列,最多保存最近的context_count行 previous_lines = deque(maxlen=context_count) for line in infile: if search_string in line: # 先写入匹配行的前context_count行上下文 outfile.writelines(previous_lines) # 写入匹配行本身(可以加个标记方便区分,比如下面注释的写法) # outfile.write(f"[MATCH] {line}") outfile.write(line) # 读取并写入匹配行的后context_count行 for _ in range(context_count): try: next_line = next(infile) outfile.write(next_line) # 把后续行加入队列,作为后续行的上下文 previous_lines.append(next_line) except StopIteration: # 文件读到末尾,停止读取后续行 break else: # 非匹配行加入队列,维护上下文 previous_lines.append(line)
代码说明:
- 内存友好:队列
previous_lines最多只保存5行数据,不管文件多大,内存开销都极小。 - 处理边界情况:如果匹配行在文件开头(前5行内),队列里只会有已读取的前面几行,不会报错;如果匹配行在文件结尾,后面不足5行就读到文件结束为止。
- 避免遗漏匹配:处理后5行时会把这些行加入队列,确保后续的匹配行能正确获取上下文,同时不会因为
next()跳过行而漏掉潜在的匹配项。
可选优化:
如果需要更清晰地区分匹配行,可以在写入匹配行时加个标记,比如把outfile.write(line)改成outfile.write(f"=== MATCHED LINE ===\n{line}"),这样输出文件里一眼就能找到目标行。
内容的提问来源于stack exchange,提问作者MaxB
相关产品推荐
相关产品推荐

