为什么 Bonobo 的 CsvReader() 方法产生元组而不是指令?
Why does Bonobo's CsvReader() method yield tuples and not dicts?
我似乎无法让 Bonobo ETL 库中的 CsvReader 生成元组以外的任何内容。该文档似乎表明它应该产生字典而不是元组,但我可能会尝试我似乎无法让它传递元组以外的任何东西。我真的很想访问附加到每个值的列名。它抛出一个错误,表明列名在传递时存在,但在我定义的转换方法中,只有值本身可用。
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
作为参数解压了一个可迭代的参数,但任何其他可能的参数声明只会抛出一个类型错误。
有什么建议吗?完全避免使用内置的 Bonobo CsvReader 而只是创建一个使用 DictReader 或其他东西的提取方法会更好吗?
编辑:这是使用除 *csv
以外的任何东西作为 printer() 的参数抛出的错误。
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 边界 = self._bind(_input)
←[90m│ ←[39m 文件 "X:\Programming\pyWarehouse\warehouse_env\lib\site-packages\bonobo\config\processors.py",第 89 行,在
_绑定
←[90m│ ←[39m return bind(*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 从 None 引发 TypeError('too many positional arguments')
←[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、循环中
←[90米│ ←[39米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 ←[97mdo的输入
es 不绑定到节点签名。
参数:()
输入:Bag(id='1', name='Alice',age='20', height='62', weight='120.6')
Kwargs:{}
签名:(csv)←[39m
文档可能存在问题,但 CsvReader 确实会生成某种元组(实际上,与命名元组非常相似),原因很简单:在 python3.5 中生成字典会导致在字段顺序更改中,一个简单的 csvread->csvwrite 将以不可复制的方式更改字段顺序。
如果您想检索 "raw" 输入(又名元组对象,未扩展为 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):
...
希望对您有所帮助。
我似乎无法让 Bonobo ETL 库中的 CsvReader 生成元组以外的任何内容。该文档似乎表明它应该产生字典而不是元组,但我可能会尝试我似乎无法让它传递元组以外的任何东西。我真的很想访问附加到每个值的列名。它抛出一个错误,表明列名在传递时存在,但在我定义的转换方法中,只有值本身可用。
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
作为参数解压了一个可迭代的参数,但任何其他可能的参数声明只会抛出一个类型错误。
有什么建议吗?完全避免使用内置的 Bonobo CsvReader 而只是创建一个使用 DictReader 或其他东西的提取方法会更好吗?
编辑:这是使用除 *csv
以外的任何东西作为 printer() 的参数抛出的错误。
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 边界 = self._bind(_input) ←[90m│ ←[39m 文件 "X:\Programming\pyWarehouse\warehouse_env\lib\site-packages\bonobo\config\processors.py",第 89 行,在 _绑定 ←[90m│ ←[39m return bind(*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 从 None 引发 TypeError('too many positional arguments') ←[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、循环中 ←[90米│ ←[39米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 ←[97mdo的输入 es 不绑定到节点签名。 参数:() 输入:Bag(id='1', name='Alice',age='20', height='62', weight='120.6') Kwargs:{} 签名:(csv)←[39m
文档可能存在问题,但 CsvReader 确实会生成某种元组(实际上,与命名元组非常相似),原因很简单:在 python3.5 中生成字典会导致在字段顺序更改中,一个简单的 csvread->csvwrite 将以不可复制的方式更改字段顺序。
如果您想检索 "raw" 输入(又名元组对象,未扩展为 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):
...
希望对您有所帮助。