使用 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,但我同意目前它有点缺乏细节。
我正在尝试 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,但我同意目前它有点缺乏细节。