使用 Bonobo-ETL 将字典写入 CSV

Writing a dict to a CSV using Bonobo-ETL

我正在尝试 Bonobo,获取字典格式的数据源,然后写入 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

TL;DR

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

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

为什么会这样?

图节点的 input/output 在通信阶段总是归一化为某种元组(也就是让节点交谈的 queues)。

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

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

bonobo.UnpackItems(...)

UnpackItems(...) 节点将从其输入流元素中获取一些参数并 "unpack" 它们(将 arg 的内容转换为输出元组中的顶级值。dict 键将是用于使它成为 namedtuple-like object,保留必要的 headers 以供以后写入。

参数是您有兴趣打开包装的 'indexes' 个项目。例如,给定此输入行:({"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,但我同意目前它有点缺乏细节。