Python如何在单个gzip文件中搜索多个指定字符串?
问题根因
你的代码存在两处关键逻辑错误,直接导致无法输出预期内容:
- 缩进层级错位:
if 'next' in line的判断被嵌套在了if 'result = one' in line的代码块内部,没有作为独立判断执行 - 代码执行流断档:进入匹配'result = one'的分支后,第一行就是
continue语句,会直接跳转到下一轮循环,分支内后续的if 'next'判断永远没有执行机会
另外你的初始逻辑偏离需求本身:根据给出的示例预期,位于'result = one'行之前的next line也需要被输出,这意味着不能采用“匹配到result行后才开始查找next字符串”的流程。
修正实现思路
gzip文件是流式读取,单次遍历到文件末尾后无法高效回退重新读取,因此可以在单轮遍历中同步完成两个任务:
- 维护布尔标记
has_result,只要遍历过程中碰到包含'result = one'的行,就将标记置为True - 维护临时列表,把遍历到的所有包含'next'的行统一存起来
- 全文件遍历完成后,确认标记为真时,再统一输出所有存好的带'next'的行
可直接运行的修正代码
import gzip # 初始化状态与存储容器 has_result = False next_line_container = [] with gzip.open('result.gz', 'rt', encoding='utf-8') as file_handle: for current_line in file_handle: # 更新result存在状态 if 'result = one' in current_line: has_result = True # 收集所有包含next的行 if 'next' in current_line: # 去掉行尾自带的换行符,避免打印时出现多余空行 next_line_container.append(current_line.rstrip('\n')) # 确认文件包含目标result字符串后,输出所有收集到的next行 if has_result: print('\n'.join(next_line_container))
运行效果
完全匹配你给出的预期输出:
next line waiting for next line please wait to print the next line
补充说明:如果你的实际需求是仅输出'result = one'行之后的所有带next的行,可以在碰到'result = one'时把标记位打开,后续遍历碰到带next的行再收集,不需要收集全文件的next行,但这种逻辑会漏掉示例中result行之前的
next line,和你给出的预期不符。
内容的提问来源于stack exchange,提问作者Ana S
相关产品推荐
相关产品推荐

