使用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
相关产品推荐
相关产品推荐

