使用Bonobo-ETL将dict写入CSV

时间:2018-03-07 12:37:57

标签: python etl export-to-csv bonobo-etl

我正在尝试使用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

1 个答案:

答案 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,但我同意现在有点缺乏细节。