使用bw2data定义Datapackage后,如何访问活动关联的元数据并存储活动名称、注释等信息?
问题分析与解决方案
看起来你是在使用Brightway(从bd.Database的调用逻辑判断)创建数据库时遇到了元数据读取的问题——明明写入了活动的name、comment等信息,但通过db.datapackage().metadata却看不到这些内容。这是因为两者存储的是不同层级的元数据,下面来具体拆解:
先回顾你的代码实现
生物数据库定义
# 生物数据库 bio_db = bd.Database("mini_biosphere") bio_db.register() co2 = bio_db.new_activity(code = 'CO2', name = 'carbon dioxide', categories=('air',), type='emission', unit='kg') co2.save() ch4 = bio_db.new_activity(code = 'CH4', name = 'methane', categories=('air',), type='emission', unit='kg') ch4.save()
技术数据库定义
# 技术数据库 a_key = ("testdb", "a") b_key = ("testdb", "b") act_a_def = { 'name': 'a', 'unit': 'kilogram', 'comment':'just saying', 'exchanges': [ {"input": co2.key, "type": "biosphere", "amount": 10}, {"input": a_key, "output":a_key,'type':'production','amount':1}, {"input": b_key, "output":a_key,'type':'substitution','amount':1}, ], } act_b_def = { 'name': 'b', 'unit': 'kilogram', 'comment':'it depends', 'exchanges': [ {"input": b_key, "output":a_key,'type':'production','amount':1}, {"input": ch4.key, "type": "biosphere", "amount": 1}, ], } db = bd.Database("testdb") db.write( { a_key : act_a_def, b_key : act_b_def } )
为什么看不到活动的name和comment?
db.datapackage().metadata获取的是数据库级别的元数据(比如数据库名称、作者、版本、整体描述等),而单个活动的name、comment是存储在活动自身的数据集里,不会自动汇总到数据库的顶层metadata中。
如何获取活动的元数据?
要读取单个活动的name、comment等信息,你需要先从数据库中加载对应的活动对象:
# 获取活动a的对象 act_a = db.get(a_key) # 读取活动元数据 print(act_a['name']) # 输出: 'a' print(act_a['comment']) # 输出: 'just saying' # 获取活动b的对象 act_b = db.get(b_key) print(act_b['name']) # 输出: 'b' print(act_b['comment']) # 输出: 'it depends'
如何添加数据库级别的元数据?
如果你想在db.datapackage().metadata中看到数据库层面的描述信息,可以在写入数据库前设置数据库的metadata属性:
db = bd.Database("testdb") # 设置数据库级元数据 db.metadata = { "name": "testdb", "description": "A test database containing activities a and b", "author": "Your Name", "version": "1.0" } # 写入活动数据 db.write( { a_key : act_a_def, b_key : act_b_def } ) # 现在读取数据库元数据就能看到这些内容 print(db.datapackage().metadata)
额外注意事项
- 确保你在写入活动后没有覆盖数据库的元数据;
- Brightway的
datapackage功能遵循Frictionless Data规范,顶层metadata只存储数据库的整体信息,单个活动的细节始终保存在活动实例中。
内容的提问来源于stack exchange,提问作者mfastudillo
相关产品推荐
相关产品推荐

