Код работает с одной функцией, но не с двумя функциями - PullRequest
1 голос
/ 10 марта 2019

Моя проблема в том, что если я использую две функции, этот код не принимает два входных аргумента.

Я пытался вставить и удалить команду click и вариант click из второй функции, но всегда получаю, что основное приложение запрашивает дополнительный аргумент (необходимо указать 2) или код не выполняется вторая функция. ("add_new_column")

Что я тут не так делаю?

import pandas as pd

@click.command()
@click.option('--infile', prompt='Your input TSV filename', help='Write your tab separated value filename.')
@click.option('--out', prompt='Your output CSV filename', help='Write your new comma separated value filename.')
def convert_tsv_to_csv(infile, out):
    """Converting a Tab Separated Value into a Comma Separated Value for given files in cli arguments"""
    df = pd.read_csv(infile, delimiter='\t')
    df.to_csv(out, sep=',')

# @click.command()
# @click.option('--out', prompt='Your output CSV filename', help='Write your new comma separated value filename.')
# def add_new_column(out):
#     """Adding a new column named  "price_edited"   """
#     df = pd.read_csv(out, delimiter=',')
#     # this line creates a new cloned column from price column, which is a Pandas series.
#     # we then add the series to the dataframe, which holds our parsed CSV file
#     df['price_edited'] = df['price']
#     # save the dataframe to CSV
#     df.to_csv(out, sep=',')


if __name__ == '__main__':
    convert_tsv_to_csv()
    #add_new_column()```

Вторая попытка:

import click
import pandas as pd


@click.command()
@click.option('--infile', prompt='Your input TSV filename', help='Write your tab separated value filename.')
@click.option('--out', prompt='Your output CSV filename', help='Write your new comma separated value filename.')
def convert_tsv_to_csv(infile, out):
    """Converting a Tab Separated Value into a Comma Separated Value for given files in cli arguments"""
    df = pd.read_csv(infile, delimiter='\t')
    df.to_csv(out, sep=',')


def add_new_column():
    """Adding a new column named  "price_edited"   """
    df = pd.read_csv(out, delimiter=',')
    # this line creates a new cloned column from price column, which is a Pandas series.
    # we then add the series to the dataframe, which holds our parsed CSV file
    df['price_edited'] = df['price']
    # save the dataframe to CSV
    df.to_csv(out, sep=',')


if __name__ == '__main__':
    convert_tsv_to_csv()
    add_new_column()

1 Ответ

0 голосов
/ 11 марта 2019

Ваша путаница заключается в неправильном понимании того, что делает Click. Щелчок используется для анализа командной строки, а затем запуска функций, указанных в командной строке.

В приведенном здесь примере вам нужна только одна функция с точки зрения командной строки. Это означает, что программа будет делать то же самое при каждом запуске. Так что вам нужна только одна функция щелчка.

Но мне нужно сделать две вещи!

Разделение работы на две функции, безусловно, может иметь смысл, но эти две функции необходимо вызывать из функции одного щелчка, например:

import pandas as pd
import click


@click.command()
@click.option('--infile', prompt='Your input TSV filename',
              help='Write your tab separated value filename.')
@click.option('--out', prompt='Your output CSV filename',
              help='Write your new comma separated value filename.')
def cli(infile, outfile):
    convert_tsv_to_csv(infile, outfile)
    add_new_column(outfile)


def convert_tsv_to_csv(infile, out):
    """Converting a Tab Separated Value into a Comma Separated Value
    for given files in cli arguments"""
    df = pd.read_csv(infile, delimiter='\t')
    df.to_csv(out, sep=',')


def add_new_column(out):
    """Adding a new column named  "price_edited"   """
    df = pd.read_csv(out, delimiter=',')
    # this line creates a new cloned column from price column, which
    # is a Pandas series.  We then add the series to the dataframe,
    # which holds our parsed CSV file
    df['price_edited'] = df['price']

    # save the dataframe to CSV
    df.to_csv(out, sep=',')

if __name__ == '__main__':
    cli()
...