python - 在 Dash 中下载 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
属性的数据。我看到有人推荐这种方法,它似乎确实有效。
数据框太大时出现问题。发生这种情况时,尝试保存文件时出现下载错误。
你认为我对问题的分类正确吗?真的有可能是尺寸问题吗?
你认为我能做些什么来解决这个问题?还有其他保存文件的解决方案吗?我需要说我不想将文件下载到静态文件夹。我需要有将文件下载到用户的默认下载文件夹的解决方案,或者使用户能够选择他想要将文件保存到的文件夹(可能会弹出窗口)。
编辑: 我找到了这个链接:http ://chandrewz.github.io/blog/downloading-large-csv-files-via-href ,它准确地描述了我遇到的问题。是否有类似于作者在 Python 中建议的解决方案?
解决方案
包中的Download
组件dash-extensions
使用 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()
推荐阅读
- javascript - 在 Raphael 上聆听动画元素的坐标
- c++ - c++ 在编译时检查函数是否被调用
- .net-core - 错误 500.19 - 在 IIS 中部署 Dot net core api 项目
- python - 使用 int() 进行转换将 16.0 转换为 15
- android - 如何在 anroid studio 中设置永久抖动 sdk 路径?
- kubernetes - Kubernetes 如何平衡 eks 工作节点的负载
- javascript - 使用 rxjs 6 如何创建带有缓存的可取消 Web 请求管道,并限制同时发生的请求数量
- c++ - Codeforces 竞赛中的运行时错误(未初始化读取)
- algorithm - for 循环的时间复杂度,其中 i 以变量(不是 1 或 0)开始
- git - 在使用 php curl 将文件上传到 Azure DevOps Git 之前,如何获取 oldObjectId?