1

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

1 回答 1

4

TL;博士

在中间使用 bonobo.UnpackItems(0) 节点。

graph = bonobo.Graph(
    bonobo.LdjsonReader(jsonld_input_file),
    bonobo.UnpackItems(0),
    bonobo.CsvWriter(csv_output_file),
)

为什么会这样?

图节点的输入/输出在通信阶段总是被归一化为某种元组(也就是让节点说话的队列)。

当你产生一个字典时,它被规范化为这个字典的一个单项元组(在倭黑猩猩图执行上下文中,yield {} 等效于 yield ({}, ))。

然后,Writer 将使用 dict-in-a-tuple 输入写入字符串表示形式。因此你的结果。

bonobo.UnpackItems(...)

UnpackItems(...) 节点将从其输入流元素中获取一些参数并“解包”它们(将 arg 的内容转换为输出元组中的顶级值。dict 键将用于使其成为命名元组-像对象一样,保留必要的标题以供以后写入。

参数是您对拆包感兴趣的项目的“索引”。例如,给定这个输入行:({"foo": 1}, {"bar": 2}, {"baz":3}),如果你通过 UnpackItems(0, 2) 节点传递它,你'将得到 (foo=1, bar=3) 作为输出(最后一个符号是 meta,它是 namedtuple 类型)。

参考应该位于http://docs.bonobo-project.org/en/develop/reference/api/bonobo/nodes.html#bonobo.nodes.UnpackItems但我同意它现在有点缺乏细节。

于 2018-03-07T13:56:11.837 回答