簡體   English   中英

在 Dash 中下載 csv 文件

[英]download csv file in Dash

我正在使用 Dash plotly 構建應用程序,該應用程序可以選擇保存 csv 文件(在應用程序運行期間創建),但我在保存 csv 文件時遇到問題。

我試圖做的是使用html.A組件,並使用以下數據設置href屬性:

csv_string = df.to_csv(encoding='utf-8', index=True)
csv_string = "data:text/csv;charset=utf-8," + urllib.parse.quote(csv_string)

csv_string是我分配給href屬性的數據。 我看到有人推薦這種方法,它似乎確實有效。

數據框太大時出現問題。 發生這種情況時,嘗試保存文件時出現下載錯誤。

  1. 你認為我對問題的分類正確嗎? 真的有可能是尺寸問題嗎?

  2. 你認為我能做些什么來解決這個問題? 還有其他保存文件的解決方案嗎? 我需要說我不想將文件下載到 static 文件夾。 我需要有解決方案,將文件下載到用戶的默認下載文件夾,或者讓用戶可以選擇 select 他想將文件保存到的文件夾(可能會彈出 windows)。

編輯:我找到了這個鏈接: http://chandrewz.github.io/blog/downloading-large-csv-files-via-href ,它准確地描述了我遇到的問題。 是否有類似於作者在 Python 中建議的解決方案?

dash-extensions package 中的Download組件使用 Blob 執行下載操作,因此它可能會解決您的問題。 這是一個小例子,

import dash
import dash_html_components as html
import numpy as np
import pandas as pd

from dash.dependencies import Output, Input
from dash_extensions import Download
from dash_extensions.snippets import send_data_frame

# Generate some example data.
data = np.column_stack((np.arange(10), np.arange(10) * 2))
df = pd.DataFrame(columns=["a column", "another column"], data=data)
# Create app.
app = dash.Dash(prevent_initial_callbacks=True)
app.layout = html.Div([html.Button("Download csv", id="btn"), Download(id="download")])

@app.callback(Output("download", "data"), [Input("btn", "n_clicks")])
def generate_csv(n_nlicks):
    return send_data_frame(df.to_csv, filename="some_name.csv")

if __name__ == '__main__':
    app.run_server()

如果您決定嘗試一下,您可以通過 pip 安裝 package

pip install dash-extensions==0.0.18

免責聲明:我是 Dash Extensions 的作者。

編輯:根據 Dash 1.20.0, Download組件已合並到dash-core-components中。 因此,可以在不使用任何第三方庫的情況下重寫上面的示例,

import dash
import dash_html_components as html
import dash_core_components as dcc
import numpy as np
import pandas as pd
from dash.dependencies import Output, Input

# Generate some example data.
data = np.column_stack((np.arange(10), np.arange(10) * 2))
df = pd.DataFrame(columns=["a column", "another column"], data=data)
# Create app.
app = dash.Dash(prevent_initial_callbacks=True)
app.layout = html.Div([html.Button("Download csv", id="btn"), dcc.Download(id="download")])

@app.callback(Output("download", "data"), [Input("btn", "n_clicks")])
def generate_csv(n_nlicks):
    return dcc.send_data_frame(df.to_csv, filename="some_name.csv")

if __name__ == '__main__':
    app.run_server()

以下是我允許使用 Dash 框架下載 CSV 文件的方法,無需額外的庫:

from flask import request, Response
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import pandas as pd

# This is in the Dash app layout
# Using Bootstrap class for nice styling
html.A(
    "Download CSV",
    id="download_csv",
    href="#",
    className="btn btn-outline-secondary btn-sm"
)


@app.callback(
    Output('download_csv', 'href'),
    [Input('some_input', 'value')]
)
def some_callback(input_value):
    """Some callback that updates the href for the button"""
    
    return f"/download_csv?value={input_value}"


@app.route('/download_csv')
def dash_download_csv():
    """Regular Flask route.
    Download a CSV file from an existing Pandas DataFrame"""

    # Here's the argument passed to the URL in the Dash callback
    value = request.args.get('value')
    df = get_df(value)
    
    # Convert DataFrame to CSV
    csv = df.to_csv(index=False)

    return Response(
        csv,
        mimetype="text/csv",
        headers={
            "Content-disposition": "attachment; filename=rcom_data.csv"
        }
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM