基于AAS pypi4.0:for循环生成多JSON文件及prop.value输出异常问题
问题解决方案
1. 批量生成独立JSON文件的实现
你的现有代码存在逻辑偏差:每次循环会重建obj_store,且遍历存储对象时会为asset和submodel各生成一个文件,不符合每行对应一个独立JSON的需求。正确实现思路是:
- 为CSV每行生成专属的Submodel(或完整AAS结构)
- 用每行唯一标识(如
name字段)作为文件名一部分,避免文件覆盖 - 每次循环仅将当前行对应的AAS结构写入单个JSON文件
2. prop.value仅输出最后一行的原因及修复
核心问题有两种可能:
- 你在for循环外部打印
prop.value:循环内每次会用新的equipment覆盖prop变量,循环结束后仅保留最后一次赋值的内容 - 代码缩进错误:若
prop的定义不在循环体内,或打印语句位置错误,也会导致仅输出最后一行值
修正后的完整代码
import pandas as pd from aas import model from aas.adapter import json # 读取CSV数据(需根据实际文件路径和分隔符调整) data = pd.read_csv("你的CSV文件路径.csv", sep="\t") # 定义通用资产对象(若每行需不同资产,可将此代码移至循环内部) asset = model.Asset( id_short="FactoryAsset", identification=model.Identifier("localhost:8080/FactoryAsset", model.IdentifierType.CUSTOM) ) for idx, row in data.iterrows(): # 提取当前行数据 name = row['name'] equipment = row['Equipment'] # 创建当前行对应的Property prop = model.Property( id_short='Specifications', value_type=model.datatypes.String, value=equipment, semantic_id=model.Reference( (model.Key( type_=model.KeyElements.CONCEPT_DESCRIPTION, local=True, value='0173-1#02-BAA120#008', id_type=model.KeyType.IRDI),) ) ) # 验证:打印当前行的prop.value(可按需删除) print(f"第{idx+1}行prop.value: {prop.value}") # 创建当前行专属Submodel submodel = model.Submodel( kind='instance', id_short='Technical_Data', identification=model.Identifier(f'localhost:8080/TechnicalData_{name}', model.IdentifierType.CUSTOM), submodel_element={prop}, ) # 初始化对象存储并添加元素 obj_store = model.DictObjectStore[model.Identifiable]() obj_store.add(asset) obj_store.add(submodel) # 生成唯一文件名并写入JSON filename = f'/KL_TECH/Code_{name}.json' with open(filename, 'w', encoding='utf-8') as json_file: json.write_aas_json_file(json_file, obj_store, indent=4, ensure_ascii=False)
关键修正点说明
- 改用
data.iterrows()遍历CSV行,避免zip可能导致的列匹配错误,同时方便获取整行数据 - 将
print(prop.value)移至循环内部,确保打印每行对应的设备值 - 为Submodel的
identification添加name后缀,保证标识全局唯一,符合AAS规范 - 用CSV的
name字段命名文件,避免重复覆盖,同时直观对应源数据行 - 移除遍历
obj_store的冗余循环,直接将完整对象存储写入单个JSON文件(符合AAS JSON标准结构)
内容的提问来源于stack exchange,提问作者MJ K
相关产品推荐
相关产品推荐

