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

时间:2014-12-18 16:34:07

标签: javascript python html5 ipython-notebook file-browser

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:12)

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

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()将显示一个按钮&#34;选择文件&#34;选择文件后,笔记本中的变量fname将包含文件路径。

参考

答案 1 :(得分:1)

这个其他的StackOverflow “How to get full path of selected file on change of <input type=‘file’> using javascript, jquery-ajax?” 已经清除了这个问题:由于安全策略,你无法从HTML(5或以前的)界面获得本地完整路径。 因此,您需要QT(或等效物品)来获得所需物品是正常的。

我一直在搜索Flash等价物,但根据这个StackOverflow,你似乎只能使用AIR: “Flex - How to browse and get the full path of a file on local machine's file system?