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



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

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

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

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

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

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

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

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

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/

这个另一个 StackOverflow"如何使用javascript,jquery-ajax在更改时获取所选文件的完整路径?"已经清除了问题:由于安全策略,您无法从 HTML(5 或更早版本(接口获取本地完整路径。因此,您需要QT(或等效物(才能获得所需的东西是正常的。

我一直在寻找一个Flash等效物,但根据这个StackOverflow,似乎你可能只有AIR才能使用它:"Flex - 如何浏览并获取本地机器文件系统上文件的完整路径?">

最新更新