1

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

错误信息中set中的单字母字符串是什么意思?

我的代码的哪一部分导致对新数据库的写入中断?

4

1 回答 1

1

调用Database('foo').write(data)需要它data是一个字典,请参阅技术文档。在这种情况下,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函数所做的一件事是确保您没有尝试将数据写入错误的数据库。它这样做的方法是遍历字典中的键data,并将第一个元素作为数据库名称。然后它会检查以确保这些名称与正在写入的数据库相同。当您传递这样的数据对象时:

{
    'alpha': 'something',
    'delta': 'something',
    'umberto': 'something',
    'california': 'something',
    ...
}

然后,当迭代您传入的对象时data,它会获取这些数据库键,即alpha,delta等。然后它会获取第一个元素(a,d等)并检查以确保数据库名称正确

这是引发此错误的实际bw2data代码

wrong_database = {key[0] for key in data}.difference({self.name})
if wrong_database:
    raise WrongDatabase("Can't write activities in databases {} to database {}".format(
                        wrong_database, self.name))
于 2016-05-10T07:54:52.930 回答