Python实现简单文本文件中含指定特征行的文本区块提取
新手友好的最简实现方案
核心逻辑(零复杂概念,逐行读取即可完成)
完全不需要编写复杂的解析规则,顺着文件的行顺序遍历即可:遇到区块起始标识就开始逐行攒内容,边攒边记录当前区块是否出现过目标特征;遇到区块结束行就校验状态——如果攒的内容包含目标特征,就把整个区块完整留存,否则直接清空临时攒的内容,从头接收下一个区块。
具体实现步骤
- 初始化两个临时状态变量:
current_temp_block:空列表,用来逐行存储当前正在收集的区块内容is_contains_target:布尔值,默认False,标记当前攒的区块里有没有出现过service prov特征行
- 逐行读取文件内容,对每一行做分支判断:
- 如果当前行是独立的
exit:- 检查
is_contains_target的状态:如果为True,就把这行exit也加到临时区块里,整体转成字符串存到最终结果列表 - 不管有没有命中条件,都清空临时区块列表、把标记位重置为
False,准备接收下一个区块
- 检查
- 如果当前行是
room开头的新区块起始行:- 直接把这行加到临时区块列表,同时把标记位重置为
False
- 直接把这行加到临时区块列表,同时把标记位重置为
- 剩下的所有区块中间行:
- 先把行内容加到临时区块列表,再检查这行是否包含
service prov,如果命中就把标记位改成True
- 先把行内容加到临时区块列表,再检查这行是否包含
- 如果当前行是独立的
可直接运行的代码
# 最终存储所有符合条件的区块 matched_blocks = [] current_temp_block = [] is_contains_target = False # 替换为你自己的文件路径即可 with open("待处理文本.txt", "r", encoding="utf-8") as file_handle: for raw_line in file_handle: # 去掉行尾的换行符,避免判断干扰 clean_line = raw_line.rstrip("\n") # 碰到区块结束标识exit if clean_line == "exit": if is_contains_target: current_temp_block.append(clean_line) matched_blocks.append("\n".join(current_temp_block)) # 重置临时状态 current_temp_block.clear() is_contains_target = False continue # 碰到新区块的起始标识 if clean_line.startswith("room"): current_temp_block.append(clean_line) is_contains_target = False continue # 处理区块中间的普通内容 current_temp_block.append(clean_line) if "service prov" in clean_line: is_contains_target = True # 输出结果到控制台,也可以自行写入到新文件 print("\n\n".join(matched_blocks))
新手避坑提醒
- 判断
exit行用的是完全相等匹配,严格对应题目里独立exit行作为区块结束的规则,不会误把内容中带exit的普通行判定为结束标记 - 特征行匹配用的是子串包含判断,不会因为目标行前后有空格、其他附带字符漏匹配
- 逐行流式读文件的方式,哪怕处理上G的超大文本也不会一次性占满内存,不需要额外做性能优化
内容的提问来源于stack exchange,提问作者SimonK
相关产品推荐
相关产品推荐

