Как загрузить загруженный файл CSV в виде файла Excel

#python #pandas #flask

#python #pandas #flask

Вопрос:

Вот моя функция просмотра.

 from flask import Flask
from config import Config
app = Flask(__name__)

UPLOAD_FOLDER = 'filepath'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

@app.route('/uploader', methods=['GET', 'POST'])
@login_required
def uploader():
    f = request.files['file']
    if not f:
        return "No file"

    stream = io.StringIO(f.stream.read().decode("UTF8"), newline=None)
    file = pd.read_csv(stream)
    return render_template("uploader.html", data=file.to_html())
 

Это индексная HTML-страница для загрузки, куда я добавляю код формы (index.html ).

 <form action = "/uploader" method = "POST"
     enctype = "multipart/form-data">
     <input type = "file" name = "file" />
     <br>
     <input type = "submit"/>
</form>
 

И именно здесь я могу увидеть загруженный CSV в формате HTML (uploader.html ).

 {% extends "base.html" %}

{% block content %}

{{ data | safe }}

{% endblock %}
 

Теперь я хочу загрузить загруженный файл CSV в формате Excel. Есть ли какой-либо подход, которому я могу следовать? Должен ли я добавить ссылку для скачивания на uploader.html файл или index.html . И для любого из них, как написать код функции просмотра? Функция просмотра загрузчика уже имеет загруженный файл CSV в своем коде. Есть ли какой-либо способ, которым я могу это использовать?

Я также думал о совместном использовании объекта file из функции просмотра загрузчика с новой функцией просмотра загрузчика, которую я еще не создал. Но есть ли какой-либо способ сделать это?

Ответ №1:

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

 @app.route("/downloader", methods=['GET', 'POST'])
@login_required
def downloader():
    f = request.files['file']
    if not f:
        return "No file"

    stream = io.StringIO(f.stream.read().decode("UTF8"), newline=None)
    df_new = pd.read_csv(stream)

    output = BytesIO()
    writer = pd.ExcelWriter(output, engine='xlsxwriter')
    df_new.to_excel(writer, sheet_name='Sheet1')
    writer.save()
    output.seek(0)
    return send_file(output, attachment_filename='output.xlsx', as_attachment=True)