Python 在 Knime 中:下载文件并将它们动态地压入工作流程
Python in Knime: Downloading files and dynamically pressing them into workflow
我在 OSX 和 Linux 上使用 Knime 3.1.2 进行 OPENMS 分析(质谱)。
目前,它使用手动放置在目录中的静态 filename.mzML 文件。它通常使用 ZipLoopStart 一次压入多个文件('Input FileS' 模块而不是 'Input File' 模块)。
我希望动态下载这些文件,然后将其压入工作流程……但我不确定这样做的最佳方式。
目前,我有一个 Python 脚本可以下载 .gz 文件(从 AWS S3)然后解压缩它们。我已经有了可以使用 StringIO 将文件解压缩到内存中的变体(并可能将它们作为数据从那里传递到工作流中??)。
它还可以将它们下载到一个目录...也许可以将它们用作源?但是我不知道如何告诉 ZipLoop 在 python 脚本是 运行 之后等待并检查目录。
我也可以将 python 脚本 运行 作为一个单独的实体(在 knime 之外),然后,一旦目录被填充,调用 knime ...但是总会有不同数量的文件(可能是 1,可能是 3)...而且我不知道如何让 'Input Files' knime 节点处理未知数量的输入文件。
我希望这是有道理的。
谢谢!
有多个选项可以让事情正常进行:
- 使用 Python 将内存中的文件转换为二进制对象单元格,稍后您可以在 KNIME 中使用它。 (这个,我不确定是否支持,但我记得它在最近的 KNIME 聚会之一中被演示过。)
- 使用 Python 将文件保存到临时文件夹 (
Create Temp Dir
) 并使用流变量连接将 Pyhon 节点连接到 KNIME 中的文件 reader 节点(应该可以工作在循环中:List Files
,检查 Iterate List of Files
元节点)。
- 可能KNIME中已经支持S3 Remote File Handling,所以你可以在KNIME中进行下载、解压。 (我不知道,但这会很好。)
我会选择选项 2,但我对 Python 不太熟悉,所以对您来说,选项 1 可能是最好的。 (如果支持选项3,那是我认为最好的。)
感谢 Gábor 让我走上正轨。尽管经过多次试验,我最终选择了一条略有不同的路线。
作为 Knime 的新手,我不知道这是对 Knime 的有效使用,还是完整的 Kluge...但它确实有效。
所以,部分问题是一些 Knime 特定的 objects - 其中之一称为 URIDataValue。
A Python Pandas 数据帧显然可以与 Knime table 互换。但是,我不知道是否有办法将这些 URIDataValue object 之一导入 Python。所以这就是我所做的...
1. 我写了一个 Python 脚本来创建一个 Pandas 数据框,并用一列填充它。一切都是字符串,包括列 header:
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
创建此数据框:
注意:列名和值只是字符串。但是(显然)重要的是 header 列是 'URIDataValue'...即使 HERE 它只是文本。如果列名不是 'URIDataValue',则下一个节点不知道要做什么。
下一步,'Python Source' 节点中的 'output_table' 被修补到 'String to URI' 节点,它(显然和神奇地)知道将整个列字符串值更改为 URIDataValues(大概基于第一列的名称......不确定)。
最后,带有正确数据 objects 的新 table 转到 'URI to PORT' 节点...因为显然 'Port' objects和 'URI' object 不同。
然后,这会将所需的输入匹配到 ZipLoop...这通常是静态(硬编码)'Input Files' 节点的输出。
现在,要真正解决上述问题,我只需将代码添加到我的 'Python Source' 中即可下载并解压缩 S3 文件,然后用它们的位置注释数据框,然后开始。
我不知道我在做什么,但它奏效了。
我在 OSX 和 Linux 上使用 Knime 3.1.2 进行 OPENMS 分析(质谱)。
目前,它使用手动放置在目录中的静态 filename.mzML 文件。它通常使用 ZipLoopStart 一次压入多个文件('Input FileS' 模块而不是 'Input File' 模块)。
我希望动态下载这些文件,然后将其压入工作流程……但我不确定这样做的最佳方式。
目前,我有一个 Python 脚本可以下载 .gz 文件(从 AWS S3)然后解压缩它们。我已经有了可以使用 StringIO 将文件解压缩到内存中的变体(并可能将它们作为数据从那里传递到工作流中??)。
它还可以将它们下载到一个目录...也许可以将它们用作源?但是我不知道如何告诉 ZipLoop 在 python 脚本是 运行 之后等待并检查目录。
我也可以将 python 脚本 运行 作为一个单独的实体(在 knime 之外),然后,一旦目录被填充,调用 knime ...但是总会有不同数量的文件(可能是 1,可能是 3)...而且我不知道如何让 'Input Files' knime 节点处理未知数量的输入文件。
我希望这是有道理的。
谢谢!
有多个选项可以让事情正常进行:
- 使用 Python 将内存中的文件转换为二进制对象单元格,稍后您可以在 KNIME 中使用它。 (这个,我不确定是否支持,但我记得它在最近的 KNIME 聚会之一中被演示过。)
- 使用 Python 将文件保存到临时文件夹 (
Create Temp Dir
) 并使用流变量连接将 Pyhon 节点连接到 KNIME 中的文件 reader 节点(应该可以工作在循环中:List Files
,检查Iterate List of Files
元节点)。 - 可能KNIME中已经支持S3 Remote File Handling,所以你可以在KNIME中进行下载、解压。 (我不知道,但这会很好。)
我会选择选项 2,但我对 Python 不太熟悉,所以对您来说,选项 1 可能是最好的。 (如果支持选项3,那是我认为最好的。)
感谢 Gábor 让我走上正轨。尽管经过多次试验,我最终选择了一条略有不同的路线。
作为 Knime 的新手,我不知道这是对 Knime 的有效使用,还是完整的 Kluge...但它确实有效。
所以,部分问题是一些 Knime 特定的 objects - 其中之一称为 URIDataValue。
A Python Pandas 数据帧显然可以与 Knime table 互换。但是,我不知道是否有办法将这些 URIDataValue object 之一导入 Python。所以这就是我所做的...
1. 我写了一个 Python 脚本来创建一个 Pandas 数据框,并用一列填充它。一切都是字符串,包括列 header:
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
创建此数据框:
注意:列名和值只是字符串。但是(显然)重要的是 header 列是 'URIDataValue'...即使 HERE 它只是文本。如果列名不是 'URIDataValue',则下一个节点不知道要做什么。
下一步,'Python Source' 节点中的 'output_table' 被修补到 'String to URI' 节点,它(显然和神奇地)知道将整个列字符串值更改为 URIDataValues(大概基于第一列的名称......不确定)。
最后,带有正确数据 objects 的新 table 转到 'URI to PORT' 节点...因为显然 'Port' objects和 'URI' object 不同。
然后,这会将所需的输入匹配到 ZipLoop...这通常是静态(硬编码)'Input Files' 节点的输出。
现在,要真正解决上述问题,我只需将代码添加到我的 'Python Source' 中即可下载并解压缩 S3 文件,然后用它们的位置注释数据框,然后开始。
我不知道我在做什么,但它奏效了。