教程(二) FME中啟動Python指令碼

2021-10-20 19:18:39 字數 4353 閱讀 2748

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方法新增的文字才會出現在日誌檔案中。

提取碼:2021

教程(一) Python和FME基礎

python 程式語言,以及 python 在fme 中的主要應用,即啟動 python 指令碼,指令碼化引數,pythoncaller pythoncreator 轉換器和關閉 python 指令碼等。而本文是五篇系列文章中的第一部分,將向您系統地介紹python程式語言,以及在 fme work...

python基礎教程(二)

設定字串的格式 替換字段包括 欄位名,轉換標誌,格式說明符。轉換標誌 當前支援的字元包括r repr s str a ascii 最簡單的情況下,只需向format提供要設定其格式的未命名引數,並在格式字串中使用未命名字段。format 1,2,foo 3,bar 4 3 1 4 2 數和字串的對齊...

python高階 pandas教程(二)

pandas資料結構 dataframe dataframe是乙個 型的資料結構,它含有一組有序的列,每列可以是不同的值型別 數值 字串 布林值 dataframe既有行索引也有列索引,可被看作是有series組成的字典。1 建立dataframe import pandas as pd impor...