Как передать Bags (named-tuples) между действиями - PullRequest
0 голосов
/ 28 ноября 2018

Я новичок в библиотеке Bonobo и создал простой поток:

  • читать простой файл CSV с именем input.csv с заголовком: Header1, Header2, Header3, Header4
  • appendновый столбец, представляющий собой конкатенацию остальных
  • , записывающих результат в CSV-файл с именем output.csv

Я использую встроенные CsvReader и CsvWriter из bonobo дляупрости.Сначала я застрял с CsvReader, не отправляющим заголовки с ячейками, и предложил обходной путь, добавив аннотацию

@ use_raw_input

для преобразования, следующего за CsvReader.Но при передаче содержимого к следующему действию пакет снова теряет заголовок и рассматривается как простой кортеж.Это работает только тогда и только тогда, когда я явно назову поля

def process_rows (Header1, Header2, Header3, Header4)

Мой код соответствует приведенному нижеточка останова в process_rows, чтобы увидеть, что вы получаете кортеж без заголовка):

import bonobo
from bonobo.config import use_raw_input

# region constants
INPUT_PATH = 'input.csv'
OUTPUT_PATH = 'output.csv'
EXPECTED_HEADER = ('Header1', 'Header2', 'Header3', 'Header4')
# endregion constants


#This is stupid because all rows are checked instead of only the first
@use_raw_input #mandatory to get the header
def validate_header(input):
    if input._fields != EXPECTED_HEADER:
        raise("This file has an unexpected header, won't be processed")
    yield input


def process_rows(*input):
    concat = ""
    for elem in input:
        concat += elem
    result = input.__add__((concat,))
    yield result


# region bonobo + main
def get_graph(**options):
    graph = bonobo.Graph()
    graph.add_chain(bonobo.CsvReader(INPUT_PATH, delimiter=','),
                    validate_header,
                    process_rows,
                    bonobo.CsvWriter(OUTPUT_PATH))
    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)
        )
# endregion bonobo + main

Спасибо за ваше время и помощь!

1 Ответ

0 голосов
/ 29 ноября 2018

Я провел несколько исследований и нашел этот «БУДУЩИЙ» документ, который, как мне кажется, вам нужен:

http://docs.bonobo -project.org / ru / master / guide / future / translations.html

Но он не реализован.

Я нашел этот похожий вопрос Почему метод Bonobo CsvReader () выдает кортежи, а не dicts?

...