IPython Notebook 打开文件对话框(检索完整路径)

Posted

技术标签:

【中文标题】IPython Notebook 打开文件对话框(检索完整路径)【英文标题】:IPython Notebook Open File Dialog (retrieve the full path) 【发布时间】:2015-02-17 12:35:43 【问题描述】:

ipython notebook 是由浏览器读取的包含富文本和 python 代码的文档。

在科学计算中,ipython 笔记本通常用于执行分析一些驻留在本地文件系统上的输入数据文件。

与其手动将包含数据的文件的完整路径粘贴到变量中,不如启动一个打开文件对话框以浏览本地文件系统并选择文件。文件的完整路径应该在一个变量中返回(在 python 中)。

这可以通过从 GUI 工具包(即 QT)启动打开文件对话框来实现。示例见IPython Notebook: Open/select file with GUI (Qt Dialog)。

但是,使用 QT 有一些缺点。首先它是一个额外的依赖。其次,它需要在笔记本中启用 QT gui 集成,这会导致与内联图发生冲突(请参阅here)。

这里的问题是,是否可以仅使用 javascript 获取完整路径?

编辑:下面发布的答案只返回文件名,而不是完整路径。

【问题讨论】:

重新编辑以使问题更清晰。 IPython notebook 具有路径自动补全功能:开始输入路径(例如“/home/”)并按 Tab:它会列出 /home/ 中的所有文件。 【参考方案1】:

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

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 将包含文件路径。

参考文献

http://www.html5rocks.com/en/tutorials/file/dndfiles/ https://jakevdp.github.io/blog/2013/06/01/ipython-notebook-javascript-python-communication/

【讨论】:

我试过了,但 fname 只有文件名而不是路径 fname 在我的情况下没有找到,尽管选择器确实出现了 只显示文件名,不显示完整路径,@2diabolos.com 的回答中对此进行了解释 上面的代码在 Jupyter Lab v3.1.14 中不再有效。 Jupyter Classic NB 从 JupyterLab 的帮助菜单中推出。它只显示“浏览...”没有选择文件。需要更完整的说明来说明如何设置。【参考方案2】:

另一个 *** "How to get full path of selected file on change of <input type=‘file’> using javascript, jquery-ajax?" 已经解决了这个问题:由于安全政策,您无法从 HTML(5 或更早版本)界面获取本地完整路径。 所以你需要 QT(或同等学历)来获得你需要的东西是很正常的。

我一直在搜索 Flash 等效项,但根据此 ***,您似乎只能使用 AIR: "Flex - How to browse and get the full path of a file on local machine's file system?"

【讨论】:

以上是关于IPython Notebook 打开文件对话框(检索完整路径)的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu14.04安装jupyter notebook

安装 Spark 问题。无法使用 pyspark 打开 IPython Notebook

IPython Notebook error: Error loading notebook

使用ipython notebook查看编辑.ipynb文件

如何用Jupyter Notebook打开Spark

Jupyter Notebook(iPython)