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

use*_*916 8 javascript python html5 file-browser ipython-notebook

ipython笔记本是浏览器读取的文档,包含富文本和python代码.

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

不是手动将包含数据的文件的完整路径粘贴到变量中,而是能够启动打开文件对话框以便浏览本地文件系统并选择文件.应该在变量中返回文件的完整路径(在python中).

这可以通过GUI工具包(即QT)启动打开文件对话框来实现.有关示例,请参阅IPython Notebook:使用GUI打开/选择文件(Qt Dialog).

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

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

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

use*_*916 12

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

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))
Run Code Online (Sandbox Code Playgroud)

在放入单元格的先前定义之后file_selector()将显示"选择文件"按钮,并且在选择文件后fname,笔记本中的变量将包含文件路径.

参考

  • 我试过,但fname只有fileName而不是路径 (5认同)