我正在尝试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处,但是我同意目前缺少一些细节。

10-07 12:00