如何将含目标检测结果的字符串解析为Python变量?
检测结果字符串转目标变量解决方案
原代码的问题在于直接按空格分割字符串,而检测结果的列表内部包含大量空格,导致分割后无法正确提取完整的检测结果部分。以下是正确的实现代码:
import ast # 读取日志文件内容 log = open(r'C:\Users\15868\Desktop\python\log.txt', "r") data = log.readline().strip() # 去除首尾的换行符和多余空格 log.close() # 精准分割文件名与检测结果部分:找到第一个空格的位置 split_pos = data.index(' ') filename = data[:split_pos] results_str = data[split_pos+1:] # 将字符串解析为Python列表(ast.literal_eval支持单引号格式的字典,适配性更强) detections = ast.literal_eval(results_str) # 批量提取所有检测结果的字段 boxes = [item['box'] for item in detections] scores = [item['score'] for item in detections] labels = [item['label'] for item in detections] # 根据检测结果数量赋值对应变量 if len(detections) == 1: box = boxes[0] score = scores[0] label = labels[0] else: box = boxes score = scores label = labels # 验证输出结果 print(f"filename = '{filename}'") if len(detections) == 1: print(f"box = {box}") print(f"score = {score}") print(f"label = '{label}'") else: print(f"box = {box}") print(f"score = {score}") print(f"label = {labels}")
代码关键说明
- 精准分割:通过
index(' ')定位第一个空格,避免了检测结果列表内部空格的干扰,确保文件名和结果部分分割准确。 - 安全解析:
ast.literal_eval()可以直接处理带单引号的字典字符串,无需额外替换引号,比json.loads()更适配原数据格式。 - 分支处理:根据检测结果的数量,自动切换单个值或列表的变量赋值逻辑,完全匹配需求中的两种场景。
测试输出示例
对于多组检测结果的输入字符串,执行后输出:
filename = 'image1' box = [[35, 0, 112, 36], [71, 80, 149, 149], [0, 81, 80, 149]] score = [0.8626706004142761, 0.8010843992233276, 0.7892318964004517] label = ['FACE_F', 'FACE_F', 'FACE_F']
对于单组检测结果的输入(如"image2 [{'box': [10,20,30,40], 'score': 0.95, 'label': 'FACE_F'}]"),输出:
filename = 'image2' box = [10, 20, 30, 40] score = 0.95 label = 'FACE_F'
内容的提问来源于stack exchange,提问作者dam1ne
相关产品推荐
相关产品推荐

