我有几个Jupyter笔记本对数据集进行分析。现在,数据集由其文件名指定。每次用户想要对新数据集执行分析时,她/他必须编辑笔记本中的相应行并修改数据集路径字符串。数据集可以位于不同的目录中。笔记本电脑也可以位于不同的目录中。在每个笔记本中,我想提供一个小部件,允许用户浏览远程文件系统并选择他/她想要分析的数据集。
然后我意识到JupyterLab是Jupyter的演变,它与我想要的东西非常相似。它已经有一个非常强大的文件浏览器,但它与其他所有东西都是“隔离的”。
谢谢。
答案 0 :(得分:3)
这是服务器端文件浏览小部件的代码。仅在常规Jypter笔记本中测试 - 而不是Jupyter Lab。此外,必须使用相当新的版本。希望这会有所帮助。
import sys
import os
import ipywidgets as ui
from IPython.display import display
class PathSelector():
def __init__(self,start_dir,select_file=True):
self.file = None
self.select_file = select_file
self.cwd = start_dir
self.select = ui.SelectMultiple(options=['init'],value=(),rows=10,description='')
self.accord = ui.Accordion(children=[self.select])
self.accord.selected_index = None # Start closed (showing path only)
self.refresh(self.cwd)
self.select.observe(self.on_update,'value')
def on_update(self,change):
if len(change['new']) > 0:
self.refresh(change['new'][0])
def refresh(self,item):
path = os.path.abspath(os.path.join(self.cwd,item))
if os.path.isfile(path):
if self.select_file:
self.accord.set_title(0,path)
self.file = path
self.accord.selected_index = None
else:
self.select.value = ()
else: # os.path.isdir(path)
self.file = None
self.cwd = path
# Build list of files and dirs
keys = ['[..]'];
for item in os.listdir(path):
if item[0] == '.':
continue
elif os.path.isdir(os.path.join(path,item)):
keys.append('['+item+']');
else:
keys.append(item);
# Sort and create list of output values
keys.sort(key=str.lower)
vals = []
for k in keys:
if k[0] == '[':
vals.append(k[1:-1]) # strip off brackets
else:
vals.append(k)
# Update widget
self.accord.set_title(0,path)
self.select.options = list(zip(keys,vals))
with self.select.hold_trait_notifications():
self.select.value = ()
f = PathSelector('/some/data')
display(f.accord)