如何使用Python读取仅存储非零元素的特殊格式矩阵文件?
实现思路
你现有代码将数据段内的换行全部删除、把所有数字打平为一维列表,丢失了GROUP和对应数值的关联关系,需要先调整读取逻辑保留行结构,再逐组解析填充,具体逻辑如下:
- 调整数据段读取逻辑:截取起止标识之间的内容后,按行拆分并过滤空行,保留原始行结构方便分组解析
- 逐行解析GROUP信息与对应数值:识别包含
GROUP关键词的行,提取GROUP序号(对应矩阵行号)、FIRST值(起始列号)、LAST值(结束列号)三个核心参数,再读取GROUP行的下一行转成浮点数列表,即为当前行需要填充的数值 - 动态确定矩阵尺寸:遍历所有GROUP的行号、LAST列号,取最大值作为矩阵的行数和列数,可适配任意大小的矩阵
- 矩阵填充:先初始化全零矩阵,再按每个GROUP的起始/结束列,把对应数值填充到对应行的切片位置,其余位置自然保留0值
完整实现代码
import re start_identifier = "SCATTER MOMENT 1" end_identifier = "SCATTER MOMENT 2" def read_data_from_file(file_name, start_identifier, end_identifier): # 读取文件并截取目标数据段 with open(file_name, 'r', encoding='utf-8') as f: content = f.read() start_idx = content.find(start_identifier) + len(start_identifier) end_idx = content.find(end_identifier) data_segment = content[start_idx:end_idx] # 按行拆分并过滤空行 lines = [line.strip() for line in data_segment.splitlines() if line.strip()] group_info = [] max_row = 0 max_col = 0 i = 0 # 遍历解析所有GROUP信息 while i < len(lines): match_res = re.match(r'GROUP\s+(\d+)\s+FIRST\s+(\d+)\s+LAST\s+(\d+)', lines[i]) if match_res: group_num = int(match_res.group(1)) first_col = int(match_res.group(2)) last_col = int(match_res.group(3)) # 读取下一行的数值列表 i += 1 values = list(map(float, lines[i].split())) group_info.append((group_num, first_col, last_col, values)) # 更新矩阵最大维度 max_row = max(max_row, group_num) max_col = max(max_col, last_col) i += 1 # 初始化全零矩阵 matrix = [[0.0 for _ in range(max_col)] for _ in range(max_row)] # 按GROUP信息填充矩阵 for group_num, first_col, last_col, values in group_info: row_idx = group_num - 1 col_start = first_col - 1 col_end = last_col matrix[row_idx][col_start:col_end] = values return matrix # 测试调用 if __name__ == "__main__": res_matrix = read_data_from_file("你的文件路径.txt", start_identifier, end_identifier) # 打印验证结果,转整型和示例对比 for row in res_matrix: print([int(x) for x in row])
内容的提问来源于stack exchange,提问作者MUD
相关产品推荐
相关产品推荐

