无法在新创建的数据库中写入活动副本

时间:2016-05-09 13:17:53

标签: brightway

我正在尝试将现有数据库中的活动副本(在这种情况下为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

错误消息中的单个字母字符串的含义是什么?

我的代码的哪一部分会导致写入新数据库失败?

1 个答案:

答案 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的对象时,它将获得这些数据库键,即alphadelta等。然后它获取第一个元素({{ 1}},a等)并检查以确保数据库名称正确

以下是引发此错误的actual bw2data code

d