我是 Bonobo 库的新手并构建了一个简单的流程:
- 读取一个名为 input.csv 的简单 CSV 文件,标题为:Header1, Header2, Header3, Header4
- 附加一个新列,它是其他列的串联
- 将结果写入名为 output.csv 的 CSV 文件
我正在使用 bonobo 的内置 CsvReader 和 CsvWriter 来简化操作。首先,我被 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
感谢您的时间和帮助!