如何修正ABAQUS Python脚本以导出所有帧位移与反力至Excel?
ABAQUS ODB文件位移与反力导出至Excel的脚本错误修正
我是Python脚本开发新手,手里有多个ABAQUS ODB文件,想编写Python脚本把所有ODB文件里所有分析步帧的位移(U)和反力(RF)导出到Excel。我写了如下脚本:
path = './'from part import * from material import * from section import * from assembly import * from step import * from interaction import * from load import * from mesh import * from optimization import * from job import * from sketch import * from visualization import * from connectorBehavior import * import random from array import * from odbAccess import openOdb import odbAccess import math import numpy import os # Operating system import shutil # copying or moving files import numpy as np # import database odbname = 'BR_70_25mm-45HRD-F' odb = session.openOdb(name = 'BR_70_25mm-45HRD-F.odb') odb = session.odbs['BR_70_25mm-45HRD-F.odb'] part_instance = odb.rootAssembly.nodeSets['M_SET-5'] for key in keys: step = odb.steps[key] frameRepository = step.frames if len(frameRepository): for frame in frameRepository: print 'Id = %d, Time = %f\n'%(frame.frameId,frame.frameValue) fo = frame.fieldOutputs f1 = fo['U'] f2 = fo['RF'] HRF3 = np.array(f1) HU3 = np.array(f2) FD = np.hstack((HU3,HRF3)) np.savetxt(path + odbname + '.csv', FD, delimiter=',')
运行时触发如下错误:
File "C:\SIMULIA\Abaqus\6.13-1\tools\SMApy\python2.6\lib\site-packages\numpy\lib\io.py", line 786, in savetxt
fh.write(format % tuple(row) + '\n')
TypeError: float argument required, not FieldOutput
请求协助修正脚本,完成数据导出工作。
错误原因
直接将FieldOutput对象转成numpy数组会失败,因为FieldOutput是节点/单元的场数据集合,需提取其中的数值分量;另外原脚本存在未定义变量keys、重复打开ODB、未处理多文件等问题。
修正后的完整脚本
# 导入必要模块 from odbAccess import openOdb import numpy as np import os # 配置参数 path = './' # ODB文件所在目录 output_suffix = '_U_RF.csv' # 输出CSV后缀 target_node_set = 'M_SET-5' # 目标节点集名称 # 获取目录下所有ODB文件 odb_files = [f for f in os.listdir(path) if f.endswith('.odb')] for odb_file in odb_files: odb_name = os.path.splitext(odb_file)[0] print(f"正在处理文件: {odb_file}") # 打开ODB文件 odb = openOdb(name=os.path.join(path, odb_file)) # 获取目标节点集 node_set = odb.rootAssembly.nodeSets[target_node_set] # 存储所有帧的数据 all_data = [] # 遍历所有分析步 for step_name, step in odb.steps.items(): # 遍历分析步下所有帧 for frame in step.frames: frame_id = frame.frameId frame_time = frame.frameValue print(f" 处理分析步: {step_name}, 帧ID: {frame_id}, 时间: {frame_time:.4f}") # 获取位移U和反力RF场输出,并仅提取目标节点集的数据 u_field = frame.fieldOutputs['U'].getSubset(region=node_set) rf_field = frame.fieldOutputs['RF'].getSubset(region=node_set) # 提取数值数据:U的三个分量(U1,U2,U3),RF的三个分量(RF1,RF2,RF3) u_data = np.array([(v.data[0], v.data[1], v.data[2]) for v in u_field.values]) rf_data = np.array([(v.data[0], v.data[1], v.data[2]) for v in rf_field.values]) # 合并数据:节点编号 + U分量 + RF分量 + 帧ID + 帧时间 node_ids = np.array([v.nodeLabel for v in u_field.values]).reshape(-1,1) frame_info = np.full((len(u_data), 2), [frame_id, frame_time]) frame_data = np.hstack((node_ids, u_data, rf_data, frame_info)) # 添加到总数据列表 all_data.extend(frame_data) # 将所有数据写入CSV文件 if all_data: # 定义CSV表头 headers = ['Node_ID', 'U1', 'U2', 'U3', 'RF1', 'RF2', 'RF3', 'Frame_ID', 'Frame_Time'] # 转换为numpy数组 all_data_np = np.array(all_data) # 写入文件:先写表头,再写数据 output_path = os.path.join(path, odb_name + output_suffix) np.savetxt(output_path, all_data_np, delimiter=',', header=','.join(headers), comments='', fmt='%f') print(f" 数据已导出至: {output_path}") # 关闭ODB文件 odb.close() print("所有ODB文件处理完成!")
关键修改说明
- 处理多ODB文件:通过
os.listdir自动遍历目录下所有.odb文件,无需手动指定单个文件名 - 正确提取场数据:使用
getSubset(region=node_set)仅提取目标节点集的数据,再遍历values提取每个节点的分量数值(v.data) - 完善数据结构:添加节点编号、帧ID、帧时间等元数据,方便后续Excel分析
- 修复ODB操作:避免重复打开ODB,处理完成后及时关闭文件
- CSV写入优化:添加表头,统一数据格式,确保numpy能正确写入浮点数值
内容的提问来源于stack exchange,提问作者Mohammed Zoheb nawaz
相关产品推荐
相关产品推荐

