Как загрузить несколько CSV-файлов без сохранения или использования ORM - PullRequest
0 голосов
/ 06 января 2020

Я хочу sh иметь одну веб-страницу с двумя загрузками (input type = submit), которая принимает два файла csv и добавляет их содержимое. Например:

# csv1
col1,col2
1,2
3,4

# csv2
col1,col2
10,20
30,40

Ожидаемый результат:

col1,col2
11,22
33,44

Но на данный момент меня не волнует вывод; просто функциональность ввода: реализация двух полей <input type="submit"> и хранение их содержимого где-либо. Я хотел бы сделать это без необходимости сохранять это (т. Е. Используя file.save), потому что это может привести к ошибкам, когда несколько пользователей сохраняют несколько файлов в каталоге сервера (я думаю?). Я также не могу использовать models.py ORM, потому что разные пользователи могут использовать разные имена входных столбцов (например, c1, c2, et c.), А количество столбцов является переменным. Тем не менее, мы можем предположить, что два входа всегда будут иметь одинаковое измерение.

Мне удалось написать маршрут для обработки одного <input> элемента, но я не уверен, как сделать two . Пока что у меня есть:

app.py ([источник]) (https://www.semicolonworld.com/question/59622/not-able-to-parse-a-csv-file-uploaded-using-flask)

from flask import Flask, make_response, request, render_template
import io
import csv

app = Flask(__name__)


@app.route('/')
def form():
    return render_template("index.html")


@app.route('/transform', methods=["POST"])
def transform_view():
    f = request.files['data_file']
    if not f:
        return "No file found"

    stream = io.StringIO(f.stream.read().decode("UTF8"), newline=None)
    csv_input = csv.reader(stream)
    csv_contents = [] # this will be a list of lists
    for row in csv_input:
        print(row)
        csv_contents.append(row)

    # automatic download of output commented out
    #stream.seek(0)
    #result = transform(stream.read().replace("=", ","))

    #response = make_response(result)
    #response.headers["Content-Disposition"] = "attachment; filename=result.csv"
    return redirect("/")

if __name__ == "__main__":
    app.run(debug=True)

index. html

<html>
<head>
    <title></title>
</head>
<body>
    <h1>Upload CSV</h1>
    <form action="/transform" method="post" enctype="multipart/form-data">
        <input type="file" name="data_file" />
        <input type="submit" />
    </form>
</body>
</html>

Я пытаюсь выяснить, как написать два маршрута, по одному для каждого поля input?

1 Ответ

0 голосов
/ 07 января 2020

Оказывается, я могу просто изменить index.html и использовать одно поле (кнопка) submit для отправки запроса POST.

В app.py , изменить transform_view() to:

@app.route('/transform', methods=["POST"])
def transform_view():
    f = request.files['input_file1']
    if not f:
        return "Input file 1 not found!"
    f = request.files['input_file2']
    if not f:
        return "Input file 2 not found!"

    stream = io.StringIO(f.stream.read().decode("UTF8"), newline=None)
    csv_input = csv.reader(stream)
    csv_contents = [] # this will be a list of lists
    for row in csv_input:
        csv_contents.append(row)

    stream = io.StringIO(g.stream.read().decode("UTF8"), newline=None)
    csv_input = csv.reader(stream)
    csv_contents2 = [] # this will be a list of lists
    for row in csv_input:
        csv_contents2.append(row)

    return redirect("/")

И index. html изменяется на:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <div>
        <h1>Input files (csv)</h1>
        <form action="/transform" method="post" enctype="multipart/form-data">
            <input type="file" name="input_file1" id="input_file1">
            <input type="file" name="input_file2" id="input_file2">
            <br>
            <input type="submit" value="Upload Files" name="submit">
        </form>
    </div>

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