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
相关产品推荐
相关产品推荐

