Python如何读取文件中指定起始与终止标记间的内容
问题:提取指定文本块的简洁Python实现
我是Python新手,需要从myfile.txt中提取START FROM THE NEXT ONE之后到****(不含)的内容,不能依赖行号,文件内容可能变化。
文件myfile.txt内容如下:
some lines that I don't really need and that can be skipped START FROM THE NEXT ONE 555555555555555 555999999999999 555333333333333 555111111111111 555333333333333 **** I don't need any of these
我自己写了三个方案:
lines = open("myfile.txt","r").readlines() #solution n 1 for x, line in enumerate(lines): if 'START FROM THE' in line: for j in range(x+1,len(lines)): if '****' in lines[j]: break print(lines[j]) break #solution n 2 startWriting= False for line in lines: if startWriting: if '****' in line: break print(line) elif 'START FROM THE' in line: startWriting = True
这两个方案能运行但不够优雅,想找更简洁高效、条件嵌套更少的方法。我还试过:
#solution n 3 wanted = [x for x in lines if x.startswith(' 5')] #THIS WORKS for line in wanted: print(line)
但这个依赖行首字符,内容变化就会失效,希望得到更好的解决办法。
优化方案
方案1:逐行迭代(内存友好,逻辑清晰)
这个方法不需要一次性加载整个文件到内存,适合处理大文件,同时逻辑简单直接:
with open("myfile.txt", "r") as f: # 跳过起始标记之前的所有行 for line in f: if 'START FROM THE NEXT ONE' in line: break # 读取内容直到遇到结束标记 for line in f: if '****' in line: break print(line, end='') # 避免重复换行,因为文件行本身带换行符
方案2:封装为可复用函数
如果需要多次提取类似内容,可以封装成生成器函数,复用性更强:
def extract_target_lines(file_path, start_marker, end_marker): with open(file_path, 'r') as f: # 定位到起始标记所在行 while True: line = next(f, None) if line is None or start_marker in line: break # 遍历输出直到遇到结束标记 for line in f: if end_marker in line: break yield line # 使用示例 for line in extract_target_lines("myfile.txt", "START FROM THE NEXT ONE", "****"): print(line, end='')
方案3:用itertools简化代码
借助itertools.dropwhile可以进一步压缩代码,适合喜欢简洁风格的场景:
from itertools import dropwhile with open("myfile.txt", "r") as f: # 跳过起始标记之前的行,再跳过起始标记行本身 after_start = dropwhile(lambda line: 'START FROM THE NEXT ONE' not in line, f) next(after_start) # 提取结束标记之前的所有行 for line in after_start: if '****' in line: break print(line, end='')
方案优势
- 内存高效:所有优化方案都是逐行处理,不会一次性加载整个文件,适合大文件场景
- 鲁棒性强:完全依赖标记字符串定位,不依赖行号或内容格式,文件内容变化后依然有效
- 可读性高:逻辑清晰,嵌套层级少,新手也容易理解
内容的提问来源于stack exchange,提问作者Nantakud
相关产品推荐
相关产品推荐

