教程(二)——FME中启动Python脚本

1、前言

本文是五篇系列文章中的第二篇,希望帮助您开始使用基本的Python和FME。在这篇文章里我们介绍了关于如何在FME工作空间中使用“启动Python脚本”功能,并给大家准备了两个示例。第一个示例是在运行转换之前使用“启动Python脚本”功能复制文件;第二个示例是将自定义(用户定义)消息写入日志文件。

2、介绍

将“启动Python脚本”功能添加到FME工作空间中能够很好的扩展工作空间的功能。当您想要先设置环境,然后再运行转换,又或者想要增强对自定义脚本提供的FME的控制,您都可以通过在FME工作空间中定义脚本的方式实现。具体操作为,在“工作区参数”>“脚本”下的“工作台导航器”窗格中,右键单击一个名为“启动Python脚本”的参数,然后选择“编辑参数值”以打开一个特殊的Python编辑窗口。在这里,您就可以输入一些Python代码,而这些代码将在转换之前被执行。

图片

用户可以在“工作区参数”>“脚本”>“启动Python脚本”下的“导航器”窗格中的“启动Python脚本”参数中输入将在转换之前被执行的Python代码。

3、 示例1:创建源数据集的.zip文件备份

下列情况适用于,当您想要在运行模板之前或之后创建数据的备份时(使用“启动Python脚本”或不使用都可以这样做)。在这个示例中,假设您想要创建shapefile格式输入数据集的zip文件备份。(您可以使用本文提供的测试模板StartupPython1.fmwt。)

打开StartupPython1.fmwt,您可以看到该模板是在将数据写入GML之前读取输入的shapefile数据集并重新投影数据。那么想在运行工作空间之前,从源数据集中创建一个zip文件,并将其放置在C盘的TEMP文件夹中(如果尚不存在;如果已经存在一个同名的zip文件,则不会复制该文件,并且会在日志窗口中显示一条消息)是如何实现的呢?

您可以转到“导航器”>“工作区参数”>“脚本”>“启动Python脚本”,就可以查看到以下python代码内容:

图片

让我们来分析一下该脚本。首先,该脚本引入FME模块和shutil模块(shutil模块 :主要用于是拷贝文件),以及从os模块导入path。

而后,由于该脚本中的核心语句:shutil.make_archive(zipDir, 'zip', sourcePath)(第23行),需要至少3个参数,即:

1.要创建的文件名,包含路径

2.存储文件的格式(此示例中为zip)

3.包含要压缩的数据的文件夹

所以我们需要事先在代码中定义这些参数值。

对于第一个和第三个参数,我们可以通过调用Python函数和FME来查找和构建。

让我们先来了解一下如何构建第一个参数。在此示例中,我们假设要在C:\ TEMP文件夹中创建源数据集的zip文件,该zip文件名称要由源shapefile文件名及后缀“ _backup”组成。

那么首先,让我们来查找和获取shapefile文件的名称。这里我们可以使用fme.macroValues []函数去访问源数据集参数(脚本中的sourceFile),从而查找到源数据集的文件路径,并仅获取文件路径的最后一部分,即获取到shapefile文件的名称。

在示例中,源数据集参数是“ SourceDataset_ESRISHAPE ”,名称可以通过在“导航器”窗格中右键单击读模块并选择“编辑用户参数定义”来找到该名称(如下图Name参数)。

图片

而要进一步获取不带扩展名的shapefile文件名(脚本中的sourceName),我们可以先使用os模块中的path.basename()函数来查找文件名,然后通过path.splitext()函数,通过获取文本中第一个出现的“.”将文本分为两部分并建表[0][1]存储,这一操作主要是为了将文本分为文件名和扩展名,之后我们只用返回第一段文本(表[0]),即为不带扩展名的文件名称。最后,我们只需再在文件名的末尾附加“ _backup”即可。

接下来,通过获取目标文件夹(编码为workspacePath),添加“ \\”,再加上文件名(sourceName),我们就完成了完整的zip路径,即第一个参数的构建。这里需要注意一下的是,由于反斜杠字符是Python中的转义字符,因此我们需要在文件路径中使用双反斜杠。

紧接着,让我们来构建第三个参数,即构建包含要压缩的数据的文件夹。

由于shapefile是基于文件夹的格式,因此您不能仅复制.shp文件,而要复制文件夹下所有相关文件。这里因为我们已经找到了源数据集文件的文件路径,所以我们可以使用path.dirname()函数来获取包含数据的文件夹的文件路径(脚本中的sourcePath)。

而为了防止覆盖具有相同名称的现有数据集,所以我们仅在源数据集的zip文件备份不存在时才创建它。如果备份位置中已经存在同名文件,则程序运行后将在“日志”窗格中显示“存在同名文件”的消息。在这种情况下,将不会创建zip文件(如下图),这些操作将在代码中由if / else语句控制。

图片

以上便是实现创建源数据集的.zip文件备份的代码逻辑。完成代码编写后,我们运行工作空间,当工作空间完成运行后,请转到C:\ TEMP文件夹,您就会看到一个zip文件,该文件的名称由原输入数据集名称添加后缀“ _backup”构成。

(注意:您可以更改脚本将目标文件夹改为另一个文件路径,不一定要是C:\ TEMP,也可以将该参数发布成用户参数,允许用户自定义选择备份的zip文件要写入的位置。)

4、 示例2:带有启动Python脚本的自定义日志消息

(该示例您可以使用本文提供的测试模板StartupPython2.fmw

图片

FME工作空间运行后生成的日志文件包含了许多信息,但是如果您想向日志文件中再写入新的自定义信息应该如何实现呢?

您依旧可以通过“启动Python脚本”,调用PythonCaller转换器以及关闭Python脚本的方法和流程将自定义消息添加到日志文件。在此示例中,假设我们要使用Startup Python脚本,即“启动Python脚本”的方式向日志文件中添加一条短消息。

通过以下Python脚本,我们就可以实现在运行FME之前将自定义消息写入日志文件中:

图片

该脚本中,首先我们使用FME Objects模块访问日志文件,因此这里我们需要的语句为import fmeobjects。然后,通过调用fmeobjects.FMELogFile()类创建名为“ logger”的FME日志文件对象。接下来,对象调用logMessageString()方法将自定义文本添加到日志文件,这里我们添加了“You can add custom text to the log file”这句自定义文本内容。最后,我们通过print()显示“这只会打印到转换日志窗口中”,这是为了对比证明通过print()功能显示到“日志”窗口的消息,不会像刚刚创建对象的方式那样出现在最终生成的转换日志文件中。

现在,让我们打开StartupPython2.fmw工作空间并运行。运行完成后,转到“日志”窗口,在窗口中右键单击,从菜单中选择“查找”,然后键入“日志”(如下图)。

图片

然后您就可以看到“日志”窗口中显示自定义日志消息和打印消息了(如下图)。

图片

第一行突出显示的内容是使用logger对象的logMessageString方法创建的。使用print()打印功能创建的是第二条突出显示的内容。

接下来,让我们跳转到运行工作空间生成的日志文件的位置。(日志文件一般默认保存在与FME工作空间相同的文件夹下,并且名称与工作空间相同,只是扩展名为.log。)使用任意文本编辑器打开日志文件,通过搜索功能在日志中查找自定义消息,我们可以发现,使用print()功能添加的文本不会出现在日志文件中,只有使用logger对象的logMessageString方法添加的文本才会出现在日志文件中。

图片

文内模板下载链接:

https://pan.baidu.com/s/1mjIcd4Uu5kTckK0494Z66g

提取码:2021

猜你喜欢

转载自blog.csdn.net/fmechina/article/details/114285453