我正在尝试使用Bonobo,以dict格式获取数据源,然后写入CSV文件。
但是,当我向bononbo.CsvWriter输出一个字典时,结果是一个包含表示为字符串的字典的单个字段。
可以使用转换脚本复制:
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
答案 0 :(得分:2)
<强> TL; DR 强>
在中间使用bonobo.UnpackItems(0)节点。
graph = bonobo.Graph(
bonobo.LdjsonReader(jsonld_input_file),
bonobo.UnpackItems(0),
bonobo.CsvWriter(csv_output_file),
)
为什么会这样?
图形节点的输入/输出总是在通信阶段(也就是让节点通话的队列)规范化为某种元组。
当你产生一个dict时,它被标准化为这个dict的一项元组(yield {}相当于yield({},),在bonobo图执行上下文中)。
然后,Writer将使用dict-in-a-tuple输入编写字符串表示。因此你的结果。
<强> bonobo.UnpackItems(...)强>
UnpackItems(...)节点将从其输入流元素中获取一些参数,并且&#34; unpack&#34;它们(在输出元组中将arg的内容转换为顶级值.dict键将用于使其成为一个类似于命名的对象,保留必要的标题以供以后写入。
参数是&#39;索引&#39;你有兴趣拆包的物品。例如,给定此输入行:({&#34; foo&#34;:1},{&#34; bar&#34;:2},{&#34; baz&#34;:3}),如果你通过一个UnpackItems(0,2)节点传递它,你得到(foo = 1,bar = 3)作为输出(最后一种表示法是meta,它是namedtuple类型的)。
参考应该住在http://docs.bonobo-project.org/en/develop/reference/api.html#bonobo.UnpackItems,但我同意现在有点缺乏细节。