IPython Notebook打开文件对话框(获取完整路径)

10
一个 ipython 笔记本是一个由浏览器读取的文档,包含丰富的文本和 Python 代码。
在科学计算中,ipython 笔记本通常用于对驻留在本地文件系统上的某个输入数据文件进行分析。
不必手动将包含数据的文件的完整路径粘贴到变量中,能够启动打开文件对话框以浏览本地文件系统并选择文件会很方便。文件的完整路径应在变量(Python 中)中返回。
可以通过从 GUI 工具包(例如 QT)启动打开文件对话框来实现此目的。请参见 IPython Notebook: Open/select file with GUI (Qt Dialog) 的示例。
但是,使用 QT 有一些缺点。首先,它是额外的依赖项。其次,它需要在笔记本中启用 QT GUI 集成,这会导致与内联图表发生冲突(请参见here)。
问题在于,是否可能仅使用 Javascript 获取完整路径?
编辑:下面发布的答案只返回文件名,而不是完整路径。

重新编辑以使问题更清晰。 - user2304916
1
IPython Notebook中对路径进行了自动完成:输入路径(如“/home/”),然后按tab键:它会列出/home/中的所有文件。 - Valentas
2个回答

13

使用HTML5构造<input type="file">,可以指示浏览器打开文件选择对话框。然后我们需要将一个javascript函数绑定到"change事件"。

Javascript可以使用kernel.execute(command)在Python内核上执行命令,以分配一个变量作为所选文件路径。

以下是一个示例:

input_form = """
<div style="border:solid navy; padding:20px;">
<input type="file" id="file_selector" name="files[]"/>
<output id="list"></output>
</div>
"""

javascript = """
<script type="text/Javascript">
  function handleFileSelect(evt) {
    var kernel = IPython.notebook.kernel;
    var files = evt.target.files; // FileList object
    console.log('Executing orig')
    console.log(files)
    // files is a FileList of File objects. List some properties.
    var output = [];
    var f = files[0]
    output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</_Mli>');
    document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
    var command = 'fname = "' + f.name + '"'
    console.log(command)
    kernel.execute(command);
  }

  document.getElementById('file_selector').addEventListener('change', handleFileSelect, false);
</script>
"""

def file_selector():
    from IPython.display import HTML, display
    display(HTML(input_form + javascript))

在之前的定义中,将file_selector()函数放入单元格中,将显示一个“选择文件”的按钮,在选择文件后,笔记本中的变量fname将包含文件路径。

参考资料


6
我尝试过了,但是fname只有文件名,没有路径信息。 - ramin
1
我的情况中找不到fname,尽管选择器确实出现了。 - netcyrax
只显示文件名,而不是完整路径,这在@2diabolos.com的答案中有解释。 - Romain Reboulleau
以上代码在 Jupyter Lab v3.1.14 和从 JupyterLab 的帮助菜单中启动的 Jupyter Classic NB 中不再起作用。它只显示“浏览...”而没有选择文件。需要更完整的说明来设置这个。 - Rich Lysakowski PhD

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接