如何使用Python删除文本文件中含低于指定值数字的行
需求说明
从目标文件中移除所有包含低于-2000数值的行。当前为Python学习阶段,对re模块用法不熟悉,现有代码存在语法错误、逻辑错误,需要正确的实现方案。
待处理示例文件内容
{ "Position": { "X": -1660.313, "Y": -3107.795, "Z": 12.85458 } { "Position": { "X": -494.0083, "Y": 57.33647, "Z": 56.59263 } { "Position": { "X": -1039.662, "Y": -2641.444, "Z": 36.96656 }
原有代码问题梳理
- 语法错误:正则表达式
r'('-'\d+)'存在单引号嵌套冲突,Python会判定字符串提前截断,直接运行会报错;同时正则没有匹配小数部分,无法识别示例中带小数点的负数值 - 逻辑反向:需求是删除包含小于-2000数值的行,原有代码逻辑是把小于-2000的行写入输出文件,和需求完全相反
- 异常风险:没有判断正则匹配结果是否为空,如果某行没有匹配到数字,直接调用
match.group()会抛出属性错误 - 匹配不全:用
re.search只会匹配每行第一个负数,会漏判同一行其他位置小于-2000的数值 - 命名不规范:用Python内置函数名
input作为文件对象变量名,容易引发隐性bug
可行实现方案
方案1:修正正则逻辑实现
import re # 预编译正则:匹配所有负号开头、支持整数/小数格式的数字 num_pattern = re.compile(r'-\d+\.?\d*') with open('file.json', 'r', encoding='utf-8') as input_f: with open("temp.json", 'w', encoding='utf-8') as output_f: for line in input_f: # 提取当前行所有匹配到的数字,转成浮点型 match_nums = [float(item.group()) for item in num_pattern.finditer(line)] # 仅当行内没有任何小于-2000的数字时,写入输出文件 if not any(num < -2000 for num in match_nums): output_f.write(line)
方案2:JSON解析实现(更推荐,无错判风险)
你的文件每行都是独立的标准JSON对象,直接用Python内置json模块解析判断,不会出现正则漏判、格式兼容问题,逻辑更可控:
import json with open('file.json', 'r', encoding='utf-8') as input_f: with open("temp.json", 'w', encoding='utf-8') as output_f: for line in input_f: line = line.strip() if not line: continue # 解析当前行JSON结构 pos_info = json.loads(line) x, y, z = pos_info['Position']['X'], pos_info['Position']['Y'], pos_info['Position']['Z'] # 三个坐标值均不小于-2000时保留该行 if min(x, y, z) >= -2000: output_f.write(line + '\n')
运行效果
用提供的示例文件测试,过滤后输出文件仅保留第二行内容:第一行Y值-3107.795、第三行Y值-2641.444均小于-2000,会被正确移除,符合预期。
内容的提问来源于stack exchange,提问作者user19544729
相关产品推荐
相关产品推荐

