You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 18:15:04