pandas/flask:下载数据帧的按钮
pandas/flask: buttons to download dataframes
我正在努力在 Flask 中复制一个 tkinter 界面。我使用 "to_html()" 在页面上显示了 pandas 个数据框。我使用了[本教程][1]。但是我需要创建按钮来下载数据帧。
创建和下载数据帧的函数位于其自己的目录“/testmodule”中的自定义模块中。下载数据框的功能与创建和显示数据框的功能是分开的。
这是 testmodule.py 的示例代码:
import pandas as pd
from Flask import render_template
def df_test():
df1 = pd.DataFrame(
{
'terms' : ['term1','term2'],
'code1': ['1234x', '4321y'],
'code2': ['2345x','5432y'],
'code3': ['3456x','6543y']
}
)
df2 = pd.DataFrame(
{
'name': ['Dan','Sara','Conroy'],
'rate': ['3','3.5','5.2'],
'location': ['FL','OH','NM'],
'code': ['4444g','6543y','2345x']
})
return render_template('view.html',tables=[df1.to_html(classes='female'), df2.to_html(classes='male')],
titles = ['na', 'Codes', 'People'])
def download_df():
output_file = 'codes_people.xlsx'
writer = pd.ExcelWriter(output_file, engine='xlsxwriter')
df1.to_excel(writer, sheet_name="Codes")
df2.to_excel(writer, sheet_name="People")
workbook = writer.book
worksheet1 = writer.sheets['Codes']
worksheet2 = writer.sheets['People']
writer.save()
我曾尝试编写下载路径,但收到未定义数据帧值的错误,据我所知,因为我正在与创建的函数分开导入 download_df 的函数调用dfs。我只是不知道如何将 df1 和 df2 的值从第一个函数传递到第二个函数,一旦它在 routes.py
我将拥有允许下载由现有 2 的列创建的新 df 的按钮。
按钮可以从模板本身调用下载函数 (download_df),还是只能通过在 routes.py 中设置一个函数来完成?如果 routes.py,如何将 df 变量传递给路由?或者,我需要创建一个临时文件吗?
最终起作用的是在第一个视图中包含文件创建命令以及数据帧,然后设置会话变量以将输出文件的文件名传递到下载视图。
def df_test():
df1 = pd.DataFrame(
{
'terms' : ['term1','term2'],
'code1': ['1234x', '4321y'],
'code2': ['2345x','5432y'],
'code3': ['3456x','6543y']
}
)
df2 = pd.DataFrame(
{
'name': ['Dan','Sara','Conroy'],
'rate': ['3','3.5','5.2'],
'location': ['FL','OH','NM'],
'code': ['4444g','6543y','2345x']
})
writer = pd.ExcelWriter(output_file, engine='xlsxwriter')
df1.to_excel(writer, sheet_name="Codes")
df2.to_excel(writer, sheet_name="People")
workbook = writer.book
worksheet1 = writer.sheets['Codes']
worksheet2 = writer.sheets['People']
writer.save()
return render_template('view.html',tables=[df1.to_html(classes='female'), df2.to_html(classes='male')],
titles = ['na', 'Codes', 'People'])
output_file = 'codes_people.xlsx'
session['otpt_file'] = 'tmp/' + output_file
def download_df():
output_file = session.get('otpt_file', None)
#return output_file
return send_file(output_file, attachment_filename='output.xlsx', as_attachment=True,mimetype='text/xlsx')
我正在努力在 Flask 中复制一个 tkinter 界面。我使用 "to_html()" 在页面上显示了 pandas 个数据框。我使用了[本教程][1]。但是我需要创建按钮来下载数据帧。
创建和下载数据帧的函数位于其自己的目录“/testmodule”中的自定义模块中。下载数据框的功能与创建和显示数据框的功能是分开的。
这是 testmodule.py 的示例代码:
import pandas as pd
from Flask import render_template
def df_test():
df1 = pd.DataFrame(
{
'terms' : ['term1','term2'],
'code1': ['1234x', '4321y'],
'code2': ['2345x','5432y'],
'code3': ['3456x','6543y']
}
)
df2 = pd.DataFrame(
{
'name': ['Dan','Sara','Conroy'],
'rate': ['3','3.5','5.2'],
'location': ['FL','OH','NM'],
'code': ['4444g','6543y','2345x']
})
return render_template('view.html',tables=[df1.to_html(classes='female'), df2.to_html(classes='male')],
titles = ['na', 'Codes', 'People'])
def download_df():
output_file = 'codes_people.xlsx'
writer = pd.ExcelWriter(output_file, engine='xlsxwriter')
df1.to_excel(writer, sheet_name="Codes")
df2.to_excel(writer, sheet_name="People")
workbook = writer.book
worksheet1 = writer.sheets['Codes']
worksheet2 = writer.sheets['People']
writer.save()
我曾尝试编写下载路径,但收到未定义数据帧值的错误,据我所知,因为我正在与创建的函数分开导入 download_df 的函数调用dfs。我只是不知道如何将 df1 和 df2 的值从第一个函数传递到第二个函数,一旦它在 routes.py
我将拥有允许下载由现有 2 的列创建的新 df 的按钮。
按钮可以从模板本身调用下载函数 (download_df),还是只能通过在 routes.py 中设置一个函数来完成?如果 routes.py,如何将 df 变量传递给路由?或者,我需要创建一个临时文件吗?
最终起作用的是在第一个视图中包含文件创建命令以及数据帧,然后设置会话变量以将输出文件的文件名传递到下载视图。
def df_test():
df1 = pd.DataFrame(
{
'terms' : ['term1','term2'],
'code1': ['1234x', '4321y'],
'code2': ['2345x','5432y'],
'code3': ['3456x','6543y']
}
)
df2 = pd.DataFrame(
{
'name': ['Dan','Sara','Conroy'],
'rate': ['3','3.5','5.2'],
'location': ['FL','OH','NM'],
'code': ['4444g','6543y','2345x']
})
writer = pd.ExcelWriter(output_file, engine='xlsxwriter')
df1.to_excel(writer, sheet_name="Codes")
df2.to_excel(writer, sheet_name="People")
workbook = writer.book
worksheet1 = writer.sheets['Codes']
worksheet2 = writer.sheets['People']
writer.save()
return render_template('view.html',tables=[df1.to_html(classes='female'), df2.to_html(classes='male')],
titles = ['na', 'Codes', 'People'])
output_file = 'codes_people.xlsx'
session['otpt_file'] = 'tmp/' + output_file
def download_df():
output_file = session.get('otpt_file', None)
#return output_file
return send_file(output_file, attachment_filename='output.xlsx', as_attachment=True,mimetype='text/xlsx')