Dynami c формы для анализа CSV в Flask - PullRequest
0 голосов
/ 01 февраля 2020

Я работаю над приложением Flask, в котором основная функция берет загруженный CSV-файл, превращает его в Pandas фрейм данных, а затем запускает серию анализов для него.

Приложение работает, но несколько жесток в процессе загрузки, требуя, чтобы он точно совпадал с именами столбцов и ожидаемыми значениями.

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

Так, например, если шаблон, который работал, был размечен следующим образом:

['Name', 'Phone', 'Email']

и загруженная версия была:

['Имя клиента', 'Номер телефона', 'Адрес электронной почты]

Я бы хотел спросить:

Какие из [«Имя клиента», «Номер телефона», «Адрес электронной почты»] соответствуют «Имени».

Предпочтительно, я бы хотел использовать Flask -wtf для обеспечения согласованности, если нет явно лучшего способа сделать это.

Я предполагаю, что способ сделать это будет сделать что-то вроде:

import pandas as pd
from flask_wtf import FlaskForm
from wtforms import SelectField

minimum_viable_columns = ['Name', 'Phone', 'Email']

data = pd.read_csv(uploaded_file)

potential_columns = []
    for x in data.columns.values.tolist():
        if x not in minimum_viable_columns:
            potential_columns.append(x)

missing_columns = []
for x in minimum_viable_columns:
    if x not in claims.columns.values.tolist():
        missing_columns.append(x)


class MatchingForm(FlaskForm):
     field_name = SelectField('Corresponding field name', choices=potential_columns)

Я должен был бы сгенерировать эти формы для каждого столбца в missing_columns, и я пытаюсь найти хороший способ сделать это и мы надеемся, что ie их всех на одну кнопку отправки.

1 Ответ

0 голосов
/ 04 февраля 2020

Таким образом, решение, которое я в итоге получил, включило al oop для создания атрибутов для формы и al oop на маршруте для flask для захвата значений. Код выглядит так:

def map_csv():
    possible_columns = session['potential_columns']
    missing_columns = session['missing_columns']

    class MappingForm(FlaskForm):
        submit = SubmitField('Submit new mapping')
        pass

    possible_columns = [(x, x) for x in possible_columns]
    if missing_columns is not None:
        for name in missing_columns:
            setattr(MappingForm, name, SelectField(name, choices=possible_columns))

    form = MappingForm()
    if request.method == 'POST':
        if form.validate_on_submit:
            mapping = {}
            for x in missing_columns:
                column = getattr(form, x)
                mapping[column.data] = x
            session['mapping'] = mapping
            return redirect(url_for('main.upload'))
    return render_template('map_csv.html', form=form)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...