Скачать фрейм данных в формате CSV из Flask - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь загрузить фрейм данных в формате CSV с помощью нажатия кнопки, но не могу понять, как это сделать - Пожалуйста, помогите мне, поскольку я новичок в flask

вот код -

df - это pandas фрейм данных, который я хочу загрузить как csv

Flask код

@app.route('/submit',methods=['POST'])
def submit():
    
    ** So here is some code for manipulation ** 
    

    df = calc.get_data(prdrop,fr_value,sumprfit,fitids)

    

    return render_template('plot.html',url=plot_url)

График. html - это дает некоторый график и кнопку для загрузки таблицы в формате csv

<body>
    <img src="data:image/png;base64,{{url}}" alt="Chart" height="auto" width="80%">
      <form action="/download" method="POST">
        <input type="Submit" value="Download excel" >
      </form>
</body>

Теперь я понимаю, что мне нужен новый URL-адрес, чтобы получить этот df, а затем позволить пользователю загрузить его, не могли бы вы помочь мне относительно того, как смогу ли я получить доступ к фрейму данных по новому URL-адресу и разрешить пользователю загружать его как csv

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вы можете использовать сеансы. Например:

Python файл

Первая часть:

import io
from flask import Flask, render_template, session, send_file
import pandas as pd


app = Flask(__name__)

# Set the secret key to some random bytes and keep it secret.
# A secret key is needed in order to use sessions.
app.secret_key = b"_j'yXdW7.63}}b7"

Функция отправки:

@app.route("/submit", methods=["GET", "POST"])
def submit():    
    # Example dataframe 
    df = pd.DataFrame(
        data={
            "city": ["Seville", "London", "Berlin"],
            "country": ["Spain", "United Kingdom", "Germany"]
        }
    )
    
    # Store the CSV data as a string in the session
    session["df"] = df.to_csv(index=False, header=True, sep=";")

    return render_template("plot.html")

Функция загрузки:

@app.route("/download", methods=["POST"])
def download():
    # Get the CSV data as a string from the session
    csv = session["df"] if "df" in session else ""
    
    # Create a string buffer
    buf_str = io.StringIO(csv)

    # Create a bytes buffer from the string buffer
    buf_byt = io.BytesIO(buf_str.read().encode("utf-8"))
    
    # Return the CSV data as an attachment
    return send_file(buf_byt,
                     mimetype="text/csv",
                     as_attachment=True,
                     attachment_filename="data.csv")

Последняя часть:

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

HTML файл ( шаблоны / график. html)

<body>
    <form action="/download" method="POST">
        <input type="Submit" value="Download CSV" >
    </form>
</body>
1 голос
/ 10 июля 2020

Flask:

html: <a href="{{url_for('get_csv', filename= 'some_csv')}}" id="download" class="btn btn-outline-info">Download</a>

@app.route('/submit',methods=['POST'])
def submit():
    
    ** So here is some code for manipulation ** 
    

    df = calc.get_data(prdrop,fr_value,sumprfit,fitids)
    session["some_csv"] = df.to_csv(index=False)
    
    return render_template('plot.html',url=plot_url)
    
    
@app.route("/get_csv/<filename>", methods=['GET', 'POST'])
def get_csv(filename):

    df = session["some_csv"]
    try:
        return send_file(df,
                         mimetype='"text/csv"',
                         as_attachment=True,
                         attachment_filename=filename
                         )

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