Jupyter notebook Jupyter(实验室):浏览笔记本中的远程文件系统

Jupyter notebook Jupyter(实验室):浏览笔记本中的远程文件系统,jupyter-notebook,jupyter,jupyter-lab,Jupyter Notebook,Jupyter,Jupyter Lab,我有几个Jupyter笔记本,可以对数据集进行分析。现在,数据集由其文件名指定。每当用户希望对新数据集执行分析时,她/他必须编辑笔记本中的相应行并修改数据集路径字符串。数据集可以位于不同的目录中。笔记本也可以位于不同的目录中。在每个笔记本中,我想提供一个小部件,允许用户浏览远程文件系统并选择他/她想要分析的数据集 是否有支持上述功能的开源项目?我正在寻找一些仍然处于活动/支持状态并且有一些基本文档的东西。我在谷歌上快速搜索,但令人惊讶的是,我什么也没找到 然后我意识到Jupyter实验室,J

我有几个Jupyter笔记本,可以对数据集进行分析。现在,数据集由其文件名指定。每当用户希望对新数据集执行分析时,她/他必须编辑笔记本中的相应行并修改数据集路径字符串。数据集可以位于不同的目录中。笔记本也可以位于不同的目录中。在每个笔记本中,我想提供一个小部件,允许用户浏览远程文件系统并选择他/她想要分析的数据集

  • 是否有支持上述功能的开源项目?我正在寻找一些仍然处于活动/支持状态并且有一些基本文档的东西。我在谷歌上快速搜索,但令人惊讶的是,我什么也没找到
然后我意识到Jupyter实验室,Jupyter的进化,与我想要的东西非常相似。它已经有一个非常强大的文件浏览器,但它有点“孤立”的一切

  • 是否可以在JupyterLab文件浏览器中获取所选文件的相对路径(相对于当前打开的笔记本)

谢谢。

以下是服务器端文件浏览小部件的代码。只在普通的Jypter笔记本电脑上测试,而不是Jupyter实验室。此外,必须使用相当新的版本。希望这有帮助

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)

很不错的;有一个小错误:在
\uuu init\uuuu
中,将
self.refresh(self.cwd)
更改为
self.refresh('.')
——否则,如果传递路径,则
os.path.join(self.cwd,item)
refresh
的开头将路径与自身连接起来。我想你不会考虑提交这个吧?