Sri*_*san 2 python plotly-dash
我目前正在使用以下脚本从我创建的破折号下载数据表。下载工作正常,但是当我在本地托管 Dash 并且当我尝试通过另一个系统单击下载按钮时,文件正在主机计算机而不是用户计算机上下载。如果我的问题看起来很愚蠢,我深表歉意,因为我对 Dash 和 python 非常陌生。
html.Button(id="save-button", n_clicks=0, children="Save"),
html.Div(id="output-1", children="Press button to save data at your desktop")
@app.callback(
Output("output-1", "children"),
[Input("save-button", "n_clicks")],
[State("table", "data")])
def selected_data_to_csv(nclicks, table1):
if nclicks == 0:
raise dash.PreventUpdate
else:
df = pd.DataFrame(table1).to_csv(
'C:\\Users\\'+loggedin_user + '\\Desktop\\Open_Queue_Dump.csv', index=False)
return "Data Submitted"
Run Code Online (Sandbox Code Playgroud)
查看dash-extensions 包,对我的应用程序有帮助。它有一个名为“下载”的组件。当您将某些内容返回给它时,系统会提示用户下载它。所以你的代码可能是这样的:
import io
import dash
import dash_html_components as html
from dash.dependencies import Input, Output, State
from dash.exceptions import PreventUpdate
from dash_extensions import Download
import dash_table
from flask import Flask
import pandas as pd
server = Flask(__name__)
app = dash.Dash(server=server)
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')
app.layout = html.Div(
[
Download(id="download"),
html.Button("Save",
id="save-button"),
html.Div("Press button to save data at your desktop",
id="output-1"),
dash_table.DataTable(
id='table',
columns=[{"name": i, "id": i} for i in df.columns],
data=df.to_dict('records'),
)
]
)
@app.callback(
Output("download", "data"),
Input("save-button", "n_clicks"),
State("table", "data"))
def download_as_csv(n_clicks, table_data):
df = pd.DataFrame.from_dict(table_data)
if not n_clicks:
raise PreventUpdate
download_buffer = io.StringIO()
df.to_csv(download_buffer, index=False)
download_buffer.seek(0)
return dict(content=download_buffer.getvalue(), filename="some_filename.csv")
if __name__ == '__main__':
app.run_server()
Run Code Online (Sandbox Code Playgroud)
是的,您正在触发下载到服务器的 C 驱动器。请参阅从此处获取的以下示例代码,它应该可以满足您的要求:
import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import urllib
df = pd.DataFrame({
'a': [1, 2, 3, 4],
'b': [2, 1, 5, 6],
'c': ['x', 'x', 'y', 'y']
})
def generate_table(dataframe, max_rows=10):
return html.Table(
# Header
[html.Tr([html.Th(col) for col in dataframe.columns])] +
# Body
[html.Tr([
html.Td(dataframe.iloc[i][col]) for col in dataframe.columns
]) for i in range(min(len(dataframe), max_rows))]
)
app = dash.Dash(__name__)
app.css.append_css({"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"})
app.layout = html.Div([
html.Label('Filter'),
dcc.Dropdown(
id='field-dropdown',
options=[
{'label': i, 'value': i} for i in
(['all'] + list(df['c'].unique()))],
value='all'
),
html.Div(id='table'),
html.A(
'Download Data',
id='download-link',
download="rawdata.csv",
href="",
target="_blank"
)
])
def filter_data(value):
if value == 'all':
return df
else:
return df[df['c'] == value]
@app.callback(
dash.dependencies.Output('table', 'children'),
[dash.dependencies.Input('field-dropdown', 'value')])
def update_table(filter_value):
dff = filter_data(filter_value)
return generate_table(dff)
@app.callback(
dash.dependencies.Output('download-link', 'href'),
[dash.dependencies.Input('field-dropdown', 'value')])
def update_download_link(filter_value):
dff = filter_data(filter_value)
csv_string = dff.to_csv(index=False, encoding='utf-8')
csv_string = "data:text/csv;charset=utf-8," + urllib.quote(csv_string)
return csv_string
if __name__ == '__main__':
app.run_server(debug=True)
Run Code Online (Sandbox Code Playgroud)