我正在尝试将现有数据库中的活动副本(在这种情况下为ecoinvent 3.2 cut-off
,但这并不重要)写入新数据库。我有:
In: ei = bw.Database('ecoinvent 3.2 cutoff')
testDB = bw.Database('testdb')
testDB.register()
bw.databases
Out: Brightway2 databases metadata with 3 objects:
biosphere3
ecoinvent 3.2 cutoff
testdb
In: act = ei.random()
actCopy = act.copy()
testDB.write(actCopy)
Out: ---------------------------------------------------------------------------
WrongDatabase Traceback (most recent call last)
<ipython-input-20-831953ab6cb9> in <module>()
----> 1 testdb.write(act)
[...]
WrongDatabase: Can't write activities in databases {'a', 'd', 'u', 'c', 'r', 'n', 'f', 'l', 't', 'p'} to database testdb
错误消息中的单个字母字符串的含义是什么?
我的代码的哪一部分会导致写入新数据库失败?
答案 0 :(得分:0)
致电Database('foo').write(data)
要求data
是字典,请参阅technical documentation。在这种情况下,actCopy
是一个活动代理,因此最简单的解决方案是使用actCopy.save()
。或者,您可以使用以下实用程序函数将活动列表转换为正确的形式:
def format_me(list_of_activities, database_obj):
return {(database_obj.name, obj['code']): obj for obj in list_of_activities}
您收到错误消息“Can't write activities in databases {'a', 'd', 'u', 'c', 'r', 'n', 'f', 'l', 't', 'p'} to database testdb
”的原因是您传递了一个列表,而write
函数所做的一件事就是确保您不< / em>尝试将数据写入错误的数据库。它执行此操作的方式是迭代字典data
中的键,并将第一个元素作为数据库名称。然后检查以确保这些名称与正在写入的数据库相同。当您传递这样的数据对象时:
{
'alpha': 'something',
'delta': 'something',
'umberto': 'something',
'california': 'something',
...
}
然后,当迭代传递给data
的对象时,它将获得这些数据库键,即alpha
,delta
等。然后它获取第一个元素({{ 1}},a
等)并检查以确保数据库名称正确
以下是引发此错误的actual bw2data
code:
d