我想使用Bokeh FileInput和一个按钮来上传zip文件,从cvs中提取数据并更新数据源。我有用于从本地目录上传zip文件,提取并读取csv文件的代码;但我正在努力用Bokeh创建一个回调,以获得与使用以下代码获得的结果相同的结果。
[欢迎提供任何帮助。我不知道该如何解决。谢谢!
上传/读取zip文件的代码(有效):
import zipfile
import os
import pandas as pd
import glob
file_name = 'somefile.zip'
path = os.path.abspath(os.getcwd())
def upload():
with zipfile.ZipFile(file_name, 'r') as file:
file.extractall(path = path)
file.close()
if __name__ == '__main__': upload()
path = os.path.abspath(os.getcwd())+'/' + file_name[:-4] + '/*.csv'
for fname in glob.glob(path):
df=pd.read_csv(fname, encoding='latin1', sep='\t')
具有bokeh的实现(需要定义回调):
from bokeh.io import curdoc, output_file, show
from bokeh.models import CustomJS, ColumnDataSource, Div, Button, FileInput
from bokeh.layouts import layout, widgetbox
callbackUpload = CustomJS(args=dict(source=source), code="""
???
}
source.change.emit();
""")
#Div: heading
h_input = Div(text="""<h2>Upload your zip file</h2> """, max_height=40)
#File input
file_input = FileInput()
#Button: upload a new zip achive
button = Button(label="Upload", button_type="danger")
button.js_on_event(events.ButtonClick, callbackUpload)
source = ColumnDataSource(df)
layout = widgetbox(h_input, file_input, button)
show(layout)
要使您的以压缩方式提取的Python代码与Bokeh回调一起使用,您将必须使用bokeh serve
和curdoc().add_root
而不是show
。
[如果您想坚持使用CustomJS
并避免不惜一切代价使用bokeh serve
,那么您必须找到一些JavaScript库来提取可在浏览器中使用的zip存档,将其附加到您的页面上(可能通过自定义的Bokeh模板可以传递给save
的代码-show
目前不支持它),并在传递给CustomJS
的JS代码中使用它。