【问题标题】:Jupyter notebook: Display dataframe such that clicking cells opens files in file explorer (e.g. Windows explorer)Jupyter notebook:显示数据框,以便单击单元格在文件资源管理器(例如 Windows 资源管理器)中打开文件
【发布时间】:2020-12-05 01:02:33
【问题描述】:

有没有办法在 Jupyter 笔记本中显示数据框,以便单击单元格在给定目录中打开 Windows 资源管理器(或任何其他本机资源管理器)?

我试过了

def make_clickable(url):
    return f'<a href="{url}" target="_blank">{url}</a>'

df = pd.DataFrame({'dir': '.'}, index=[0])
styled = df.style.format({'dir': make_clickable})
display(styled)

df = pd.DataFrame({'dir': 'file:///C:/'}, index=[0])
styled = df.style.format({'dir': make_clickable})
display(styled)

前者打开一个新的浏览器选项卡,其中显示 Jupyter 树(在正确的相对位置,如果我用另一个相对路径替换 .)。

后者不做任何事情。如果我右键单击在新选项卡中打开,它会给出about blank#blocked,如果我将它复制并粘贴到新选项卡地址行,它会显示浏览器内置的资源管理器,而不是 Windows 资源管理器。

我尝试用_explorer.exe 替换_blank,但这并没有改变任何一种变体。

因此,这两个选项都不是我想要的。

(我知道,安全性...但是,这是完全离线设置的内部工具)

我知道从浏览器打开浏览器是有可能的,因为我可以在 Jupyter 单元格中使用os.startfile,所以我想也许有一种方法可以在单击数据框的单元格时执行任意代码?也许这需要某种小部件?

当然,我总是可以编写一个完整的 Python GUI,但我真的不想这样做。

【问题讨论】:

    标签: python jupyter-notebook external


    【解决方案1】:

    我有点晚了,但我终于弄明白了。出于安全原因,Javascript 本身无法打开文件资源管理器。但是javascript可以在Jupyter notebook(Jupyter.notebook.kernel.execute)中执行python代码,python可以使用(os.startfile('.'),subprocess.run等)打开windows explorer。

    下面是代码。 linux 可以按预期正常工作,但在 windows 下,资源管理器会打开但不会进入用户焦点,它还会显示图标后面的橙色蜂鸣灯,表明它应该没问题。

    import pandas as pd
    import os
    import subprocess
    
    windowsv1 = """ 
    <p onclick="Jupyter.notebook.kernel.execute(`os.startfile('C:\\Users')`)">File Explorer.</p>
    """
    windowsv2 = """ 
    <p onclick="Jupyter.notebook.kernel.execute(`subprocess.run(['explorer', 'C:\\Users'])`)">File Explorer.</p>
    """
    
    linux = """ 
    <p onclick="Jupyter.notebook.kernel.execute(`subprocess.call([opener, r'/home/equinox'])`)">File Explorer.</p>
    """
    
    def make_clickable(url):
        return windowsv2
    
    df = pd.DataFrame({'dir': '.'}, index=[0])
    styled = df.style.format({'dir': make_clickable})
    display(styled)
    

    【讨论】:

      【解决方案2】:

      我对此不是 100% 的,但我认为这取决于您使用的浏览器。此外,我认为大多数浏览器都会阻止这种行为,并且不允许网页链接打开您的文件浏览器。

      如果我错了,请有人纠正我。

      编辑 2020-08-15

      如果您安装 Chrome 浏览器扩展程序,则可以做到这一点。 只需点击以下链接。在你的代码为我工作之后。

      https://www.alphr.com/browse-and-open-folders-files-chrome/

      1. 向下滚动到标题“从 Chrome 打开任何本地文件”。
      2. 按照所有步骤操作
      3. 安装浏览器扩展程序(以及额外的安装文件)后不要忘记重新启动 Chrome

      【讨论】:

      • 我自己已经表明了这一点。但正如我所说,在常规 Jupyter 单元格中写入 os.startfile('.') 表明有办法。
      • 关于编辑:谢谢,这似乎确实符合我的要求。我仍然希望其他人提供替代解决方案,因为这有点侵入性并且仅适用于 Chrome+Windows
      猜你喜欢
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多