无法在新创建的数据库中写入 activity 的副本
Can't write copy of activity in newly created databases
我正在尝试将现有数据库(在本例中为 ecoinvent 3.2 cut-off
,但这无关紧要)的 activity 的副本写入新数据库。我有:
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
报错信息中集合中的单字母字符串是什么意思?
我的代码的哪一部分导致写入新数据库失败?
调用Database('foo').write(data)
需要data
是一个字典,见technical documentation。在这种情况下,actCopy
是一个 activity 代理,因此最简单的解决方案是使用 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
函数所做的其中一件事是确保您是 not 试图将数据写入错误的数据库。它这样做的方式是遍历字典data
中的键,并将第一个元素作为数据库名称。然后它检查以确保这些名称与正在写入的数据库相同。当您像这样传递数据对象时:
{
'alpha': 'something',
'delta': 'something',
'umberto': 'something',
'california': 'something',
...
}
然后,当迭代你传递给 data
的对象时,它会得到这些数据库键,即 alpha
、delta
等。然后它取第一个元素 ( a
、d
等)并检查以确保数据库名称正确
这是引发此错误的 actual bw2data
code:
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))
我正在尝试将现有数据库(在本例中为 ecoinvent 3.2 cut-off
,但这无关紧要)的 activity 的副本写入新数据库。我有:
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
报错信息中集合中的单字母字符串是什么意思?
我的代码的哪一部分导致写入新数据库失败?
调用Database('foo').write(data)
需要data
是一个字典,见technical documentation。在这种情况下,actCopy
是一个 activity 代理,因此最简单的解决方案是使用 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
函数所做的其中一件事是确保您是 not 试图将数据写入错误的数据库。它这样做的方式是遍历字典data
中的键,并将第一个元素作为数据库名称。然后它检查以确保这些名称与正在写入的数据库相同。当您像这样传递数据对象时:
{
'alpha': 'something',
'delta': 'something',
'umberto': 'something',
'california': 'something',
...
}
然后,当迭代你传递给 data
的对象时,它会得到这些数据库键,即 alpha
、delta
等。然后它取第一个元素 ( a
、d
等)并检查以确保数据库名称正确
这是引发此错误的 actual bw2data
code:
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))