为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Bonobo的CsvReader()方法产生元组而不是字典?

为什么Bonobo的CsvReader()方法产生元组而不是字典?

幕布斯6054654 2021-05-13 14:18:46
我似乎无法在Bonobo ETL库中获得CsvReader来生成除元组以外的任何内容。该文档似乎表明它应该产生字典而不是元组,但是尝试一下,我似乎无法让它通过除元组以外的任何东西。我真的很想访问附加到每个值的列名。它引发一个错误,表明在传递时会出现列名,但是在我定义的转换方法中,只有值本身可用。import bonobodef printer(*csv):    print(csv)def get_graph(**options):    graph = bonobo.Graph()    graph.add_chain(        bonobo.CsvReader('csv.txt'),        printer    )    return graphdef get_services(**options):    return {}if __name__ == '__main__':    parser = bonobo.get_argument_parser()    with bonobo.parse_args(parser) as options:        bonobo.run(get_graph(**options), services=get_services(**options))它与打印机方法的参数有关吗?我知道,*csv当参数解压缩可迭代的参数时,其他任何可能的参数声明都将引发typeError。有什么建议么?避免完全使用内置的Bonobo CsvReader而不是仅创建使用DictReader或类似方法的提取方法会更好吗?
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

文档可能存在问题,但是CsvReader确实会产生某种元组(实际上,它与namedtuples非常相似)是出于一个简单的原因:在python3.5中产生dict将导致字段顺序更改,以及一个简单的csvread -> csvwrite将以不可复制的方式更改字段顺序。


如果要检索“原始”输入(又称元组对象,未扩展为args),则可以使用@use_raw_input装饰器。


from bonobo.config import use_raw_input


@use_raw_input

def some_node(row):

    for f in row._fields:

        ...

如果您知道期望的字段是显式的,则使用关键字参数是另一个选择。


def some_node(id, name, value):

    ...

希望能有所帮助。


查看完整回答
反对 回复 2021-05-18
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信