ipython notebook 是由浏览器读取的包含富文本和 python 代码的文档。
在科学计算中,ipython notebook 通常用于对驻留在本地文件系统上的一些输入数据文件执行分析。
与其手动将包含数据的文件的完整路径粘贴到变量中,不如启动一个打开文件对话框以浏览本地文件系统并选择文件会更方便。文件的完整路径应在变量中返回(在 python 中)。
这可以通过从 GUI 工具包(即 QT)启动打开文件对话框来实现。有关示例,请参见 IPython Notebook: Open/select file with GUI (Qt Dialog) .
但是,使用 QT 有一些缺点。首先,它是一个额外的依赖。其次,它需要在笔记本中启用 QT gui 集成,这会导致与内联图发生冲突(参见 here)。
这里的问题是,是否可以仅使用Javascript获取完整路径?
编辑:下面发布的答案只返回文件名,而不是完整路径。
最佳答案
使用 HTML5 构造 <input type="file">
可以指示浏览器打开文件选择器对话框。然后我们需要将一个 javascript 函数绑定(bind)到“已更改的事件”。
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
在笔记本中将包含文件路径。
引用资料
关于javascript - IPython 笔记本打开文件对话框(检索完整路径),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27551399/