我正在尝试Bonobo,以dict格式获取数据源,然后写入CSV文件。
但是,当我向bononbo.CsvWriter发出dict时,结果是一个包含以字符串表示的dict的单个字段。
可以使用转换脚本来复制它:
graph = bonobo.Graph(
bonobo.LdjsonReader('test.jsonl'),
bonobo.CsvWriter('test.csv'),
)
同样,显式使用dict将具有相同的结果:
graph = bonobo.Graph(
lambda: {'header': 'test'},
bonobo.CsvWriter('test.csv'),
)
以上结果将是
{'header': 'test'}
而不是预期的
header
test
最佳答案
TL; DR
在中间使用bonobo.UnpackItems(0)节点。
graph = bonobo.Graph(
bonobo.LdjsonReader(jsonld_input_file),
bonobo.UnpackItems(0),
bonobo.CsvWriter(csv_output_file),
)
为什么会这样呢?
图节点的输入/输出在通信阶段(也就是让节点交谈的队列)始终被标准化为某种元组。
当您生成字典时,将其标准化为该字典的一个项目元组(在no黑猩猩图执行上下文中,yield {}等于yield({},))。
然后,编写器将使用“元组中的字典”输入来编写字符串表示形式。因此,您的结果。
bonobo.UnpackItems(...)
UnpackItems(...)节点将从其输入流元素中获取一些参数,并将其“解包”(将arg的内容转换为输出元组中的顶级值。dict键将用于使其成为namedtuple-像对象一样,保留必要的标头以便以后写入。
参数是您有兴趣拆箱的物品的“索引”。例如,给定以下输入行:({“ foo”:1},{“ bar”:2},{“ baz”:3}),如果通过UnpackItems(0,2)节点传递该行, ll得到(foo = 1,bar = 3)作为输出(最后一个表示法是meta,它是namedtuple类型的)。
参考文献应该存在于http://docs.bonobo-project.org/en/develop/reference/api/bonobo/nodes.html#bonobo.nodes.UnpackItems处,但是我同意目前缺少一些细节。