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

使用Python提取文本第二列含H行的前后相邻行实现求助

文本行筛选需求及正确实现方案

需求说明

读取文本文件每一行,行内数值由一个或多个空格分隔,允许存在空行。当某行的第二列(Python索引为1)为字符H时,提取该行的前一行(可为空行)、含H的目标行本身,以及目标行的后一行(可为空行),最终将结果写入输出文件。

测试输入示例(file.txt)

173 H B  120.24    8.76
174 Y B  125.13    8.88
175 E B  121.65    8.77
176 T B  122.94    9.22
177 L H  129.04    9.19
178 A B  117.33    7.62
179 R B  122.34    8.15
180 F H  124.32    8.81
181 E B  125.43    8.78
182 L C  124.83    8.13
183 S C  114.31    8.50
184 E C  120.65    8.36
185 H C  119.53    8.52
186 H C  119.67    8.62



  1 M U    ****    ****
  2 A C  127.24    8.61
  3 H B  116.05    8.41
  4 C B  124.62    9.23

预期输出示例(output.txt)

173 H B  120.24    8.76
174 Y B  125.13    8.88

184 E C  120.65    8.36 
185 H C  119.53    8.52 
186 H C  119.67    8.62

185 H C  119.53    8.52
186 H C  119.67    8.62

2 A C  127.24    8.61
3 H B  116.05    8.41
4 C B  124.62    9.23

原有代码问题分析

  • 直接遍历line是遍历单个字符,没有按空格切分行获取列数据,判断逻辑完全错误
  • 试图用str(line) - 1做索引运算,字符串无法参与数值计算,不符合列表索引逻辑
  • 用with open语法打开的文件会自动关闭,额外调用close()属于语法冗余

正确实现代码

# 读取所有行到列表,保留原始格式
with open("file.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()

output_lines = []
line_count = len(lines)

# 按索引遍历所有行
for idx in range(line_count):
    current_line = lines[idx]
    # 按任意数量空格切分行,跳过空行、列数不足的行
    parts = current_line.split()
    if len(parts) < 2:
        continue
    # 判断第二列是否为目标字符H
    if parts[1] == "H":
        # 计算前后行范围,避免索引越界
        start = max(0, idx - 1)
        end = min(line_count, idx + 2)
        output_lines.extend(lines[start:end])
        # 每组结果之间加空行分隔,匹配预期输出格式
        output_lines.append("\n")

# 写入输出文件
with open("output.txt", "w", encoding="utf-8") as f:
    f.writelines(output_lines)

内容的提问来源于stack exchange,提问作者teez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:24:02