Python读取文本文件并提取每行psnr_y对应值的实现方法
Python 文本键值对读取与psnr_y值提取实现
核心基础函数说明
Python实现这类文本读取时,常用的内置/第三方函数与Matlab的能力对应关系如下:
open():内置文件操作入口,对应Matlab的fopen(),可指定文件路径、只读文本模式参数,返回可遍历的文件对象。- 文件对象逐行遍历:自动按行读取内容,对应Matlab的
fgetl()逐行读取逻辑,不需要手动操作文件指针回退。 float()+math.inf:可解析普通浮点数、文本中的inf特殊值,和Matlab的浮点解析能力对齐。numpy.array():将提取的数值转换为矩阵格式,匹配Matlab的数组存储习惯。
代码实现
满足核心需求:仅提取psnr_y值存入矩阵
import numpy as np import math psnr_y_list = [] # with上下文自动管理文件开关,不需要手动调用fclose with open('data.txt', 'rt') as f: for line in f: # 去除行首尾空白后,按空格拆分所有键值对片段 kv_segments = line.strip().split() for seg in kv_segments: # 每个片段按冒号拆分键、值字符串 key, val_str = seg.split(':') if key == 'psnr_y': # 兼容inf格式的特殊值解析 if val_str == 'inf': val = math.inf else: val = float(val_str) psnr_y_list.append(val) break # 转换为列向量格式的矩阵,和Matlab存储习惯一致 psnr_y_matrix = np.array(psnr_y_list).reshape(-1, 1)
完全对齐原Matlab逻辑的全量解析版本
对应原Matlab将所有键值对结构化存储的逻辑:
import numpy as np import math # 存储结构化的解析结果,对应Matlab的struct结构 parsed_result = {} with open('data.txt', 'rt') as f: # 读取第一行,获取所有键名,对应Matlab统计分隔符数、匹配解析格式的逻辑 first_line = f.readline().strip() first_segments = first_line.split() key_list = [seg.split(':')[0] for seg in first_segments] # 为每个键初始化数值存储列表 for k in key_list: parsed_result[k] = [] # 解析第一行的数值 for seg in first_segments: k, v_str = seg.split(':') v = math.inf if v_str == 'inf' else float(v_str) parsed_result[k].append(v) # 解析剩余行的所有内容 for line in f: segments = line.strip().split() for seg in segments: k, v_str = seg.split(':') v = math.inf if v_str == 'inf' else float(v_str) parsed_result[k].append(v) # 直接提取psnr_y对应的矩阵 psnr_y_matrix = np.array(parsed_result['psnr_y']).reshape(-1, 1)
原Matlab代码的逻辑映射对照
- 原Matlab中
fopen打开文件、fclose关闭文件的流程,Python用with上下文管理器自动完成文件生命周期管理,避免遗漏关闭操作。 - 原Matlab中统计冒号数量、动态生成解析格式、文本扫描的流程,Python通过按空格拆分行、按冒号拆分键值的方式实现,不需要提前计算分隔符数量,代码更简洁。
- 原Matlab中
cell2struct将键名和对应值绑定的逻辑,Python用字典结构存储所有键对应的数值列表,后续可直接通过键名取值,访问逻辑和Matlab结构体完全一致。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

