Я использую Knime 3.1.2 на OSX и Linux для анализа OPENMS (Mass Spectrometry).
В настоящее время он использует статические файлы filename.mzML, которые вручную помещаются в каталог. Он обычно имеет несколько файлов, которые были нажаты за один раз (модуль «Input FileS» не является модулем «Входной файл») с использованием ZipLoopStart.
Я хочу, чтобы эти файлы загружались динамически, а затем вдавались в рабочий процесс ... но я не уверен, что это лучший способ.
В настоящее время у меня есть скрипт Python, который загружает файлы .gz (из AWS S3), а затем распаковывает их. У меня уже есть варианты, которые могут распаковать файлы в память с помощью StringIO (и, возможно, передать их в рабочий процесс оттуда в качестве данных?).
Он также может загрузить их в каталог ... что, возможно, их можно использовать в качестве источника? Но я не знаю, как сообщить ZipLoop подождать и проверить каталог после запуска скрипта python.
0: Я также мог бы запустить скрипт python как отдельный объект (за пределами knime), а затем, как только каталог будет заполнен, вызовите knime ... ОДНАКО всегда будет разное количество файлов (может быть, 1, может быть, три) ... и я не знаю, как заставить knime-узел «Input Files» обрабатывать неизвестное количество входных файлов.
Надеюсь, это имеет смысл. Спасибо!Python in Knime: Загрузка файлов и их динамическое нажатие в рабочий процесс
ответ
Gábor для получения меня на правильном пути. Хотя после много экспериментов я закончил несколько иначе.
Будучи новым для Knime, я не знаю, если это эффективное использование Knime, или полный Клюге ... но он работает.
Таким образом, часть проблемы - некоторые из специфических объектов, связанных с Knime. Один из них называется URIDataValue.
Патч-код Python Pandas, по-видимому, взаимозаменяемо с таблицами Knime. Однако я не знаю, есть ли способ импортировать один из этих объектов URIDataValue в Python. Итак, вот что я сделал ...
1. Я написал скрипт Python, который создает Pandas Dataframe и заполняет его одним столбцом.Все это строка, включая заголовок столбца:
from pandas import DataFrame
# Create empty table
T = DataFrame(
[
['file:///Users/.../copy/lfq_spikein_dilution_1.mzML'],
['file:///Users/.../copy/lfq_spikein_dilution_2.mzML'],
],
)
T.columns = ['URIDataValue']
#print T
output_table = T
Это создает этот dataframe:
Примечание: Имя столбца и значения являются просто строки. Но важно (по-видимому), чтобы заголовок столбца был «URIDataValue» ... хотя ЗДЕСЬ это просто текст. Если имя столбца не является «URIDataValue», следующий узел не знает, что делать.
СЛЕДУЮЩИЙ, 'output_table' из узла 'Python Source' исправлен до узла 'String to URI', который (по-видимому и магически) знает, чтобы изменить все строковые значения столбцов на URIDataValues (предположительно на основе имени из первого столбца ... не знаю, что точно).
И, наконец, таблица NEW с правильными объектами данных переходит на узел «URI to PORT» ... поскольку видимые объекты «Port» и «URI» отличаются друг от друга.
Это значит, что этот вход соответствует ZipLoop ..., который обычно находится вне статического (жесткого) узла входных файлов.
Теперь, чтобы решить вопрос выше, я просто должен добавить код в свой «источник Python» для загрузки и распаковки файлов S3, а затем аннотировать фреймворк с их местоположениями и перейти.
Я понятия не имею, что я делаю, но это сработало.
Есть несколько вариантов, чтобы позволить вещам работать:
- Преобразования файлов в памяти в бинарную клетку объектов с помощью Python, а затем вы можете использовать его в KNIME. (Этот, я не уверен, поддерживается, но, как я помню, он был демонстрацией на одном из последних собраний KNIME.)
- Сохраните файлы во временную папку (
Create Temp Dir
) с помощью Python и подключите узел Pyhon, используя поток переменное соединение с узлом чтения файлов в KNIME (который должен работать в цикле:List Files
, проверьтеIterate List of Files
metanode). - Возможно, в KNIME есть поддержка S3 Remote File Handling, поэтому вы можете выполнять загрузку, распаковывая в KNIME. (Не то, чтобы я знал, но было бы неплохо.)
Я бы выбрал вариант 2, но я не очень хорошо знаком с Python, поэтому для вас, вероятно, вариант 1 является лучшим. (В случае, если вариант 3 поддерживается, это лучше всего, на мой взгляд.)
Очень хорошо обобщенный пост с подробными пояснениями. Могу ли я предложить принять этот ответ вместо моего? –
Конечно. Я просто хотел удостовериться, что вы получили какие-то кредиты. Постскриптум Я просто понял, что читаю книгу, которую вы написали: D – RightmireM
Отлично. Спасибо. :) (Надеюсь, книга поможет в начале, хотя я должен признать, что она немного устарела сейчас, так как теперь узлы Rule Engine сильно отличаются друг от друга, а другие узлы также значительно улучшились, потоковая передача была правильной (хотя и не полностью еще).) Удачи, используя KNIME! :) –