Jupyter 笔记本:显示数据框,以便单击单元格在文件资源管理器中打开文件(例如 Windows 资源管理器)

Jupyter notebook: Display dataframe such that clicking cells opens files in file explorer (e.g. Windows explorer)

有没有一种方法可以在 Jupyter notebook 中显示数据框,以便单击单元格在给定目录中打开 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,但我真的不愿意。

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

如有不妥之处请各位指正

编辑 2020-08-15

如果您安装 Chrome 浏览器扩展程序,则可以执行此操作。 只需按照以下 link。在你的代码对我有用之后。

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

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

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

下面是代码。 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)