Диалог открытия файла записной книжки IPython (получение полного пути)

Записная книжка ipython - это документ, который читается браузером и содержит как форматированный текст, так и код Python.

В научных вычислениях ноутбуки ipython часто используются для анализа некоторого файла входных данных, который находится в локальной файловой системе.

Вместо того, чтобы вручную вставлять полный путь к файлу, содержащему данные, в переменную, было бы удобно иметь возможность запустить диалог открытия файла, чтобы просмотреть локальную файловую систему и выбрать файл. Полный путь к файлу должен быть возвращен в переменной (в python).

Этого можно добиться, запустив диалог открытия файла из набора инструментов графического интерфейса (например, QT). Для примера см. Блокнот IPython: открытие / выбор файла с графическим интерфейсом ( Qt Dialog).

Однако использование QT имеет некоторые недостатки. Во-первых, это дополнительная зависимость. Во-вторых, для этого требуется включить интеграцию QT gui в записную книжку, что приводит к конфликтам со встроенными графиками (см. здесь).

Вопрос в том, можно ли получить полный путь, используя только Javascript?

ИЗМЕНИТЬ: ответ, представленный ниже, возвращает только имя файла, а не полный путь.


person user2304916    schedule 18.12.2014    source источник
comment
Отредактировано, чтобы сделать вопрос более ясным.   -  person user2304916    schedule 18.12.2014
comment
В записной книжке IPython есть автозаполнение для путей: начните вводить путь (скажем, / home /) и нажмите вкладку: он перечислит все файлы в / home /.   -  person Valentas    schedule 10.03.2015


Ответы (2)


Использование конструкции 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))

После ввода предыдущих определений в ячейку file_selector() отобразится кнопка «Выбрать файл», а после выбора файла переменная fname в записной книжке будет содержать путь к файлу.

использованная литература

person user2304916    schedule 18.12.2014
comment
Я пробовал это, но у fname есть только имя файла, а не путь - person ramin; 14.10.2016
comment
fname не найдено в моем случае, хотя селектор отображается - person netcyrax; 27.09.2017
comment
Отображается только имя файла, а не полный путь, и это объясняется в ответе @ 2diabolos.com - person Romain Reboulleau; 07.08.2020

этот другой StackOverflow "Как получить полный путь к выбранному файлу при изменении‹ input type = 'file' ›с помощью javascript, jquery-ajax?" уже снял вопрос: вы не можете получить локальный полный путь из HTML (5 или более ранний) интерфейс из-за политики безопасности. Так что это нормально, что вам нужен QT (или эквивалент), чтобы получить то, что вам нужно.

Я искал эквивалент Flash, но похоже, что он у вас может быть только с AIR в соответствии с этим StackOverflow: "Flex - Как просмотреть и получить полный путь к файлу в файловой системе локального компьютера? "

person 2diabolos.com    schedule 10.02.2016