You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:53:14