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

Python如何批量保存500个带名称的不同尺寸数组到文本文件

批量存储A0~A499异构尺寸数组的实战方案

第一步:归集零散的全局变量

你之前通过exec循环生成的A0到A499都是散在全局命名空间的独立变量,不用挨个硬编码写变量引用,直接按命名规则批量匹配提取即可:

  • 遍历全局变量,筛选出符合命名规则的numpy数组,统一归集到字典里方便后续统一操作:
import numpy as np
import os

target_arrays = {}
for var_name, var_val in globals().items():
    # 匹配A0、A1…这类固定命名格式
    if var_name.startswith('A') and var_name[1:].isdigit():
        arr_idx = int(var_name[1:])
        # 范围限定在0~499,同时校验变量类型是numpy数组,避免误匹配其他同名的非数组变量
        if 0 <= arr_idx < 500 and isinstance(var_val, np.ndarray):
            target_arrays[var_name] = var_val

注意:如果你的数组是定义在函数内部的局部变量,把上面代码里的globals()换成locals()就能匹配到局部作用域的变量,完全不需要修改之前的exec生成逻辑。
提个实用建议:把数组归集到字典之后,后续的数组生成循环可以直接写target_arrays[f"A{i}"] = SMtoM(outputS(115,15,0.62)),不用再走exec生成全局变量的逻辑,从根源上减少后续批量操作的复杂度。

方案1:单文件整合存储(推荐,便于归档和快速回溯)

如果不想生成500个零散的文本文件,可以把所有数组写到同一个文本文件里,用固定格式的标记行记录每个数组的原始命名、尺寸,完全不丢失原命名信息:

with open('all_stored_arrays.txt', 'w', encoding='utf-8') as f:
    # 按数组索引顺序写入,避免文件内容乱序
    for arr_idx in range(500):
        arr_name = f'A{arr_idx}'
        arr_data = target_arrays[arr_name]
        # 写专属标记行,*硬绑定数组的原始命名和原始尺寸*,方便后续读取时快速定位
        f.write(f'=== ARRAY {arr_name} ORIGINAL SHAPE {arr_data.shape} ===\n')
        # 直接复用你已经熟悉的np.savetxt逻辑,把数组内容写到当前文件句柄
        np.savetxt(f, arr_data)
        # 空行做分隔,避免不同数组的内容粘连
        f.write('\n')

这种存储方式的优势:

  • 每个数组的原始命名、尺寸都直接写入文件,后续读取不需要提前记住每个数组的维度信息
  • 不需要自己手写浮点数格式化逻辑,复用np.savetxt的原生精度控制,避免存读过程出现精度丢失
  • 单文件比几百个零散文件好归档、好传输,不会出现文件顺序混乱、缺失的问题

对应的读取还原逻辑可以直接复用numpy的加载能力,按标记行拆分即可:

loaded_arrays = {}
current_marker = None
current_content = []

with open('all_stored_arrays.txt', 'r', encoding='utf-8') as f:
    for line in f:
        stripped_line = line.strip()
        # 遇到新的数组标记行,就把之前攒的内容解析成独立数组
        if stripped_line.startswith('=== ARRAY '):
            # 先处理上一个已缓存的数组内容
            if current_marker is not None and current_content:
                loaded_arrays[current_marker] = np.loadtxt(current_content)
            # 提取当前标记对应的数组名
            current_marker = stripped_line.split(' ')[2]
            current_content = []
        elif stripped_line:
            current_content.append(stripped_line)
    # 别漏了文件最后一个数组的解析逻辑
    if current_marker is not None and current_content:
        loaded_arrays[current_marker] = np.loadtxt(current_content)

# 后续要调用对应数组直接从字典里取就行,比如取A321:a321 = loaded_arrays['A321']

方案2:拆分独立文本文件存储

如果你更习惯单数组单文件的存储结构,直接在归集好的字典基础上循环写入即可,每个文件用对应的数组名命名:

# 新建独立文件夹存放所有数组,避免和项目其他脚本、文件混放
os.makedirs('separate_array_files', exist_ok=True)
for arr_name, arr_data in target_arrays.items():
    np.savetxt(f'separate_array_files/{arr_name}.txt', arr_data)

这种方式的优劣:

  • 优势是单个文件损坏不会影响其他数组的内容,读取的时候不需要逐行扫描标记定位
  • 劣势是文件数量多,长期存储和传输的时候容易出现文件缺失、顺序混乱的问题

内容的提问来源于stack exchange,提问作者Aryan Bansal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 12:06:07