【问题标题】:Why does Bonobo's CsvReader() method yield tuples and not dicts?为什么 Bonobo 的 CsvReader() 方法产生元组而不是字典?
【发布时间】:2018-08-03 13:39:20
【问题描述】:

我似乎无法让 Bonobo ETL 库中的 CsvReader 生成元组以外的任何内容。文档似乎表明它应该产生 dicts 而不是元组,但尽我所能尝试我似乎无法让它传递除元组以外的任何东西。我真的很想访问附加到每个值的列名。它会抛出一个错误,提示列名在传递时存在,但在我定义的转换方法中,只有值本身可用。

import bonobo


def printer(*csv):
    print(csv)


def get_graph(**options):
    graph = bonobo.Graph()
    graph.add_chain(
        bonobo.CsvReader('csv.txt'),
        printer
    )
    return graph


def 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 或其他东西的提取方法会更好吗?

编辑:这是使用除*csv 以外的任何内容作为打印机()的参数时引发的错误。

CRIT|0002|bonobo.execution.contexts.base←[90m:←[39m ←[90m│ ←[39mTraceback(最近一次调用最后): ←[90m│ ←[39m 文件“X:\Programming\pyWarehouse\warehouse_env\lib\site-packages\bonobo\config\processors.py”,第 102 行,我 n 通话 ←[90m│ ←[39m bound = self._bind(_input) ←[90m│ ←[39m 文件“X:\Programming\pyWarehouse\warehouse_env\lib\site-packages\bonobo\config\processors.py”,第 89 行,在 _绑定 ←[90m│ ←[39m 返回绑定(*self.args, *_input, **self.kwargs) ←[90m│ ←[39m 文件“C:\Users\Accounting Admin\AppData\Local\Programs\Python\Python37-32\lib\inspect.py”,第 3002 行,在 b 工业 ←[90m│ ←[39m return args[0]._bind(args[1:], kwargs) ←[90m│ ←[39m 文件“C:\Users\Accounting Admin\AppData\Local\Programs\Python\Python37-32\lib\inspect.py”,第 2923 行,在 _ 绑定 ←[90m│ ←[39m raise TypeError('too many positional arguments') from None ←[90m├←[39m←[100m←[97m TypeError ←[39m←[49m ←[97m位置参数太多←[39m ←[90m│ ←[39m上述异常是以下异常的直接原因: ←[90m│ ←[39mTraceback(最近一次调用最后): ←[90m│ ←[39m 文件“X:\Programming\pyWarehouse\warehouse_env\lib\site-packages\bonobo\execution\contexts\node.py”,行 102,在循环中 ←[90m│ ←[39m self.step() ←[90m│ ←[39m 文件“X:\Programming\pyWarehouse\warehouse_env\lib\site-packages\bonobo\execution\contexts\node.py”,行 132、步中 ←[90m│ ←[39m 结果 = self._stack(input_bag) ←[90m│ ←[39m 文件“X:\Programming\pyWarehouse\warehouse_env\lib\site-packages\bonobo\config\processors.py”,第 112 行,我 n 通话 ←[90m│ ←[39m )) 来自 exc ←[90m└←[39m←[100m←[97m bonobo.errors.UnrecoverableTypeError ←[39m←[49m ←[97m输入 es 不绑定到节点签名。 参数:() 输入:包(id='1', name='Alice',age='20', height='62', weight='120.6') 夸格斯:{} 签名:(csv)←[39m

【问题讨论】:

    标签: python python-3.x csv etl bonobo-etl


    【解决方案1】:

    文档可能存在问题,但 CsvReader 确实产生了某种元组(实际上,与 namedtuples 非常相似),原因很简单:在 python3.5 中产生 dicts 会导致字段顺序更改,并且一个简单的 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-12-14
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      相关资源
      最近更新 更多