在 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
属性的数据。
我看到有人推荐这种方法,而且看起来确实有效。
Data frame过大时出现问题。发生这种情况时,尝试保存文件时出现下载错误。
你觉得我对问题的分类正确吗?真的有可能是尺码问题吗?
你认为我可以做些什么来解决这个问题?还有其他保存文件的解决方案吗?我需要说我不想将文件下载到静态文件夹。我需要一个解决方案,将文件下载到用户的默认下载文件夹,或者让用户可以选择 select 他想将文件保存到的文件夹(弹出的 windows也许向上)。
编辑:
我发现这个 link: http://chandrewz.github.io/blog/downloading-large-csv-files-via-href 准确描述了我遇到的问题。有没有类似于作者在Python中建议的解决方案?
dash-extensions
包中的 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 安装软件包
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"
}
)
我正在使用 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
属性的数据。
我看到有人推荐这种方法,而且看起来确实有效。
Data frame过大时出现问题。发生这种情况时,尝试保存文件时出现下载错误。
你觉得我对问题的分类正确吗?真的有可能是尺码问题吗?
你认为我可以做些什么来解决这个问题?还有其他保存文件的解决方案吗?我需要说我不想将文件下载到静态文件夹。我需要一个解决方案,将文件下载到用户的默认下载文件夹,或者让用户可以选择 select 他想将文件保存到的文件夹(弹出的 windows也许向上)。
编辑: 我发现这个 link: http://chandrewz.github.io/blog/downloading-large-csv-files-via-href 准确描述了我遇到的问题。有没有类似于作者在Python中建议的解决方案?
dash-extensions
包中的 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 安装软件包
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"
}
)