天天看點

《基于ArcGIS的Python程式設計秘笈(第2版)》——1.3 Python語言基礎

本節書摘來自異步社群《基于arcgis的python程式設計秘笈(第2版)》一書中的第1章,第1.3節,作者: 【美】eric pimpler(派普勒) 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

了解python語言的基本架構,有助于讀者更有效地編寫arcgis地理處理腳本。盡管python語言相對于其他程式設計語言來說更易學,但要想真正掌握它,也需要花一定的時間來學習和練習。本節将介紹如何建立變量及給變量指派,可指派給變量的資料類型,如何使用不同類型的語句和對象,如何讀寫檔案和導入python第三方子產品等内容。

1.3.1 代碼注釋

編寫python腳本時,一般都需要遵循約定俗成的程式架構。通常在每個腳本的開頭是說明部分,用來說明腳本的名稱、作者和處理過程的梗概,以幫助程式員快速了解腳本的細節和用途。在python中,說明部分通常使用注釋來實作。注釋是腳本中以#或##開頭的代碼行,#或##後跟随說明代碼的文字,用來解釋腳本中某些代碼或代碼塊的功能。注釋隻起到說明代碼的作用,在代碼運作時python解釋器并不執行它。如圖1-11所示,注釋是以#為字首的代碼行。要盡量在整個腳本的重要部分添加注釋,以使程式更易讀,這對更新腳本非常有用。

《基于ArcGIS的Python程式設計秘笈(第2版)》——1.3 Python語言基礎

1.3.2 子產品導入

盡管python語言有很多内置的函數,能夠完成不同的功能,但仍然需要經常通路存儲在外部子產品中的具有特定功能的函數集以完成特定的功能。例如,math子產品存儲與數值處理有關的特定函數,r子產品提供與統計分析有關的函數等。一般說來,函數是一個已命名的代碼塊,執行時隻需調用其名稱。子產品則是由一系列函數構成的,它可以通過import語句導入。import語句通常是腳本檔案中的第1行代碼(不包括注釋)。在編寫arcgis地理處理腳本時,需要導入arcpy子產品,該子產品是通路arcgis提供的gis工具和函數的python工具包。下面的代碼展示了如何導入arcpy子產品和os子產品,其中os子產品提供了與底層作業系統進行互動操作的接口。

1.3.3 變量

一般來說,變量可視為計算機記憶體中的一塊區域,用來存儲腳本運作過程中的值。在python中進行變量定義時,并不需要預先聲明變量的類型,隻需直接命名和指派,通過引用變量名就可以在腳本中任意位置通路賦給變量的值。例如,建立一個包含要素類名稱的變量,然後通過緩沖區工具引用該變量可以建立一個新的輸出資料集。在建立一個變量時隻需指定它的名稱,通過指派運算符(=)就可以實作變量的指派,如下所示。

表1-1列出了以上代碼示例的變量名和賦給變量的值。

《基于ArcGIS的Python程式設計秘笈(第2版)》——1.3 Python語言基礎

建立變量必須遵循如下命名規則。

變量名由字母、數字或下劃線組成。

第1個字元必須是字母或下劃線(最好避免使用下劃線,因為首字元為下劃線的變量在python中有特殊的含義)。

不能使用除下劃線以外的其他特殊字元。

不允許使用python關鍵字和空格。

命名變量時必須避免使用python語言的關鍵字,如class、if、for、while等。在python語句中,這些關鍵字通常會以不同的顔色突出顯示。

下面是一些合法的變量名。

下面是一些非法的變量名。

python語言區分大小寫,是以要特别注意腳本中的大小寫,如變量的命名等。對初學者來說,大小寫問題是最常見的錯誤來源,是以當代碼出現錯誤時要首先考慮大小寫問題。來看一個例子,下面是3個變量,雖然每個變量的名字相同,但是由于大小寫的不同,實際上建立的是3個不同的變量。

如果輸出這些變量,會得到以下結果。

要變量名在整個腳本中保持一緻,最好的做法就是采用camel命名法,即變量名的第1個單詞全部小寫,而後連接配接的每個單詞的首字母大寫。如以變量名fieldownername為例來說明這一概念。第1個單詞(field)所有字母小寫,第2個單詞(owner)和第3個單詞(name)的首字母大寫。

fieldownername

python中的變量是動态的,也就是說不需要預先聲明變量的類型,變量指派時就已經隐式地聲明變量的類型了。指派給變量的常用資料類型如表1-2所示。

《基于ArcGIS的Python程式設計秘笈(第2版)》——1.3 Python語言基礎

接下來的章節會詳細介紹這些資料類型。

在c#中,使用變量之前必須先定義變量的名稱和類型,而python則隻需定義變量名,通過指派就可以使用該變量,變量的具體資料類型由python背景識别。

下面的c#代碼示例建立了一個名為atouchdown的整型變量,它隻能包含整數資料,然後給該變量指派整數6。

在python中,這個變量可以動态地建立和指派,如下列代碼所示。python解釋器可以動态地判斷賦給變量的資料類型。

有時候需要建立一個變量,但事先并不知道具體為它賦何值,在這種情況下,可以簡單地建立一個沒有指派的變量,下面的代碼示例就建立了這樣一個變量。

指派給變量的資料可以在腳本運作時改變。

變量可以存儲不同類型的資料,包括基本資料類型,如字元串和數字,以及更複雜的資料類型,如清單、字典和對象等。接下來介紹可以指派給變量的不同資料類型以及python提供的各種操作資料的功能。

1.3.4 内置資料類型

python有一些内置的資料類型。這裡首先介紹string類型,之前已經給出幾個string變量的例子,這種變量類型有多種操作方式,下面詳細介紹這種資料類型。

1.字元串

字元串是字元的有序集合,用于存儲和表示文本資訊。當字元串指派給變量時,要由英文單引号或雙引号括起來,它可以是一個名稱、要素類名稱、where子句或其他任何可編碼的文本。

2.字元串操作

在python中,字元串有多種操作方式,其中字元串連接配接是比較常用且容易實作的操作方式之一。“+”操作符可以把它兩邊的字元串變量連接配接起來形成一個新的字元串變量。

運作上述代碼,将得到以下結果。

判斷字元串是否相等可以使用“==”操作符,就是簡單地把兩個等号放在一起。讀者一定要注意不要混淆相等操作符和指派運算符:相等操作符有兩個等号,而指派運算符隻有一個等号;相等操作符用于判斷兩個變量是否相等,而指派運算符用于給變量指派。

運作上述代碼示例會得到以下結果,是因為“firstname”和“lastname”變量不相等。

判斷變量是否包含某個字元串可以使用“in”操作符,如果第 1 個操作對象包含于第2個操作對象中則傳回true。

正如前文所述,字元串是字元的有序集合,也就意味着可以通路字元串中的單個字元或一串字元,隻要不人為改變,字元的順序都會保持不變。而有些集合卻不能保持設定的順序,如字典等。在python中,通路單個字元稱為索引,通路一串字元稱為切片。

字元串中的單個字元可以通過字元串變量後的方括号内的偏移量來獲得,如使用fc[0]可以獲得fc變量的第1個字元。python是一種從零開始的語言,也就是說清單中第1項的索引值是0。負偏移用于從字元串的末尾逆向搜尋,在這種情況下,字元串最後一個字元的索引值是−1。索引總是建立一個新變量來儲存字元。

圖1-12說明了字元串是字元的有序集合,第1個字元的索引值是0,第2個字元的索引值是1,接下來的每個連續字元按順序占用一個索引值。

《基于ArcGIS的Python程式設計秘笈(第2版)》——1.3 Python語言基礎

https://yqfile.alicdn.com/ba362e32fc03ac36d05ad3c76df8e5b3d0d312cc.png" >

字元串索引隻能獲得string變量的單個字元,而字元串切片能夠提取字元串的連續序列,其格式和文法與索引類似,但需要引入第二偏移量來指定要截取的字元序列的結束位置,進而獲得要傳回的子字元串。

下面的代碼是一個字元串切片的例子,先把“floodplain.shp”指派給“thestring”變量,然後使用thestring[0 : 5]獲得“flood”切片。

提示: 

python切片傳回的字元開始于第一偏移量,結束于第二偏移量,但不包括第二偏移量。這對于初學者來說特别容易混淆,也是一種經常犯的錯誤。在上述例子中,傳回的變量包含“flood”字元串,第1個字元的索引值是0,對應字元“f”,最後一個傳回的字元索引值是4,對應字元“d”。請注意,索引值5不包括在内,因為python切片僅傳回到第二偏移量的前一個索引值對應的字元。

任一偏移量都可以省略,這實際上是建立了一個通配符。例如,thestring[1:]要求python傳回從第2個字元開始到字元串末尾的所有字元;thestring[:-1]要求python傳回從第1個字元開始到倒數第2個字元的所有字元。

python是一門優秀的語言,在字元串操作方面提供了很多函數,可以友善地對字元串進行處理。但是限于篇幅,大多數的字元串操作功能本書并沒有介紹,僅僅介紹如下字元串操作功能。

計算字元串長度。

轉換大小寫。

去除開頭和結尾的空白。

查找字元串中字元。

文本替換。

用分隔符把字元串拆分成一系列單詞。

格式化。

使用python編寫面向arcgis的地理處理腳本時,經常需要引用計算機本地或者共享伺服器上的資料集,實際上引用資料集就是引用了存儲在變量中的路徑。在python中,路徑名稱需要單獨提及。很多程式設計語言通常用反斜杠來定義路徑,但python中的反斜杠是轉義字元和續行符的标志,是以需要使用雙反斜杠(\)、單正斜杠(/)或者以r為字首的單反斜杠()來定義路徑。在python中,路徑名一般存儲為字元串,如下列代碼所示。

以下是非法的路徑引用。

以下是合法的路徑引用。

3.數字

python内置的數值型資料有int、long、float和complex等。把數字指派給變量的方式與字元串類似,不同之處在于不需要使用引号把值引起來并且它還必須是一個數值。

python支援所有常用的數字操作,包括加、減、乘、除、取模和求餘等,還可以使用函數進行傳回絕對值、将字元串轉換成數值型資料和四舍五入等操作。

盡管python提供了一些内置的數學函數,但是如果要通路其他更進階的數學函數則需要使用math子產品。當然,在使用這些函數前必須先使用import導入math子產品,代碼如下。

math子產品提供的函數有向上舍入和向下取整函數、絕對值函數、三角函數、對數函數、角轉換函數和雙曲函數等。值得注意的是,python并沒有提供函數來計算中位數或平均值,需要程式設計來實作。有關math子產品的更多細節可以通過單擊“all programs | arcgis | python 2.7 | python manuals”來檢視。打開python manual後,在目錄欄裡單擊“the python standard library | numeric and mathematical modules”,你就可以檢視任何的資料類型、文法、内置函數以及其他想詳細了解的内容了,在此不一一贅述。

4.清單

python提供的第3種内置資料類型是清單。清單是元素的有序集合,它可以存放python支援的任何一種資料類型,也可以同時存放多種資料類型。這些資料類型可以是數字、字元串、其他清單、字典和對象等。例如,一個清單變量可以同時存放數字和字元串。清單是從零開始的,即清單中第1個元素的索引值是0,如圖1-13所示。

《基于ArcGIS的Python程式設計秘笈(第2版)》——1.3 Python語言基礎

https://yqfile.alicdn.com/7f33aabe6a710f49cd439a25061892e6a496da5d.png" >

之後清單中每個連續對象的索引值依次增加1。此外,清單的長度可以根據需要動态地增長和收縮。

清單是通過在方括号内賦一系列的值來建立的。要提取清單中的值,隻需在變量名後的方括号内填寫相應的索引值即可,代碼如下所示。

通過使用append()方法可以在已有的清單中添加新元素,具體代碼如下。

清單可以通過切片傳回多個值。下列代碼所示為用冒号隔開兩個偏移量進行清單切片操作,第一偏移量表示起始索引值,第二偏移量表示終止索引值,注意并不是傳回終止索引值對應的值,而是其前一個索引對應的值,前面已經講述。清單切片傳回的是一個新的清單。

清單本質上是動态的,即可以在已有的清單中添加元素、删除元素和改變已有的内容,且這些操作不需要建立新的清單副本。改變清單中的值可以通過索引或切片來實作,索引改變的是清單中的單個值,而切片改變的是清單中的多個值。

python 中有許多操作清單中值的方法,如:sort()方法可以對清單中的内容進行升序或降序排列;append()方法可以在清單的末尾添加元素,而insert()方法可以在清單的任意位置插入元素;remove()方法可以移除清單中第1個與參數比對的項,而pop()方法可以删除清單中的元素(預設是最後一個)并傳回該元素的值;reverse()方法可以對清單中的内容進行反向排序。

5.元組

元組與清單類似,但也有一些明顯的差別。與清單一樣,元組也是由值的序列組成,這些值可以是任何類型的資料;與清單不同的是,元組的内容是靜态的。元組建立後,既不能更改值的順序,也不能添加或删除值,當一些清單資料需要固定不變時,元組的這一特性恰好滿足要求。建立元組很簡單,就是把值放在括号内并用逗号分隔開,如下代碼所示。

讀者可能已經注意到建立元組與建立清單非常相似,差別僅在于元組使用圓括号而清單使用方括号。

與清單類似,元組的索引值從0開始,通路存儲在元組中的值的方法與清單相同,代碼示例如下。

當清單的内容要求是靜态時,通常用元組代替清單,因為清單不能保證這一點,而元組可以。

6.字典

字典是python中第2類集合對象。它類似于清單,所不同的是字典是對象的無序集合。字典通過鍵而不是偏移量來存儲和擷取值,字典中的每個鍵都有一個關聯值,如圖1-14所示。

《基于ArcGIS的Python程式設計秘笈(第2版)》——1.3 Python語言基礎

https://yqfile.alicdn.com/f241b0d1d13ba91eadc0e6c7f0b95350fab41996.png" >

與清單類似,在字典中也可以使用函數來改變字典的長度。下面的代碼示例介紹了如何建立字典并為其指派,以及如何使用鍵來通路字典中的值。建立字典要使用花括号,花括号内的每個鍵後面有一個冒号,冒号後是與這個鍵相關聯的值,這些鍵/值對用逗号分隔開。

常用的字典操作包括擷取字典中元素的數量、使用鍵擷取值、确定鍵是否存在、将鍵轉換成清單以及擷取一系列的值等操作。字典對象可以在适當的位置改變、擴大和收縮,也就是說python不需要建立一個新的字典對象來儲存修改過的字典。給字典中的鍵指派可以通過在花括号中聲明鍵并設定它等于某個值來實作。

小技巧: 

與清單不同,字典不能切片,因為它的内容是無序的。如果需要周遊字典中所有的值,可以使用keys()方法,它能傳回一個包含字典中所有鍵的集合,并且可以單獨指派或取值。

1.3.5 類和對象

類和對象是面向對象程式設計的基本概念。盡管python傾向于面向過程的程式設計,但也支援面向對象的程式設計。在面向對象程式設計中,類用于建立對象執行個體,可以把類視為建立一個或多個對象的模闆。每個對象執行個體具有相同的屬性和方法,但對象存儲的資料通常是不同的。對象是python中的複雜資料類型,由屬性和方法組成,可以像其他資料類型一樣指派給變量。屬性包含與對象相關的資料,而方法是對象可以執行的操作。

下面用一個例子來解釋這些概念。在arcpy中,extent類是通過給出矩形左下角和右上角的地圖坐标來指定的矩形。extent類包含一些屬性和方法。屬性包括xmin、xmax、ymin、ymax、spatialreference等,其中x、y的最大值和最小值屬性存儲extent矩形的坐标,spatialreference屬性存儲extent類中spatialreference對象的空間參考系。extent類的對象執行個體可以通過點記法(.)來設定和擷取屬性值。這個例子的代碼示例如下。

腳本運作的結果如下。

extent類還提供了一些對象可以執行的方法,大多數方法是extent對象和其他幾何圖形之間的幾何運算,如contains()(包含)、crosses()(相交)、disjoint()(不相交)、equals()(相等)、overlaps()(重疊)、touches()(鄰接)和within()(包含于)等。

另一個需要掌握的面向對象的概念是點記法,它是一種通路對象的屬性和方法的方式,同時也表示了這些屬性或方法屬于某一個特定的類。

點記法使用的文法是在對象執行個體後跟一個點,其後是屬性或方法的名稱。不管是通路屬性還是方法,其文法描述都是一樣的,但是,如果是通路方法,方法名後要有一個圓括号,括号内可以沒有參數也可以有多個參數,如下列代碼所示。

1.3.6 語句

python中的每一行代碼稱為一條語句。python有許多不同類型的語句,如有建立變量和給變量指派的語句、有根據測試結果執行分支代碼的條件語句和多次執行代碼塊的循環語句等。在腳本中編寫語句時,需要遵循一定的規則。建立變量和指派語句在前文中已經介紹過,下面介紹其他類型的語句。

1.條件語句

if/elif/else 語句是 python 中基本的條件判斷語句,用來判斷給定條件的true/false值,以決定條件後代碼分支的執行情況,即使用條件語句可以控制程式的流程。下面給出一個條件判斷的示例:如果變量存儲了點要素類,則擷取它的x、y坐标;如果要素類名稱為“roads”,則擷取name字段。

在python中,true值是指任何非零數字或非空對象;false值是指零數字或空對象,往往表示不正确。一般地,比較測試的傳回值是1或0(真或假),布爾運算的and/or運算的傳回值是真或假。

python的代碼編寫必須遵循一定的文法規則。語句是一條條順序執行的,直到遇到分支語句,通常使用的分支語句是if/elif/else語句。此外,也可以使用for和while等循環結構來改變程式流程。python會自動檢測語句和代碼塊的邊界,是以不需要在代碼塊的邊界使用括号或分隔符,而是使用縮進來确定代碼塊(這一點與c和c#等語言是不同的)。許多程式設計語言使用分号來結束語句,但python不是這樣。複合語句中需要包含“:”,它的編寫規則是:複合語句首行以冒号結束,其後代碼塊中的語句需要以相同量級逐行縮進在複合語句首行的下方即可。

2.循環語句

循環語句是根據需要可以重複執行的代碼行。如果條件表達式的結果為true,while循環體就會重複執行,如果條件表達式的結果為false,python會跳出循環,執行while循環後的代碼。在下面的代碼示例中,首先給x變量指派為10,while循環語句判斷x的值是否小于100,如果是,則輸出x的目前值并且x的值增加10,然後繼續判斷while後的條件表達式的值。第2次循環時,x的值變為20仍然小于100,是以條件表達式的值仍為true,然後執行輸出x值和累加操作,這個過程一直循環,直到x大于或等于100。當x的值不滿足x<100的條件時,此時測試結果為false,循環結束。在編寫while語句時要特别注意,必須要有跳出循環的條件,否則會陷入死循環。死循環是計算機程式無限次循環執行指定的代碼。無論是由于循環不具有終止條件或盡管有終止條件但不能滿足,還是由于有導緻循環重新開始的條件,都會陷入死循環。

for循環是一種可按預定的次數執行代碼塊的循環方式,它有兩種情況:一種是計數循環,可以根據預定次數循環代碼塊;另一種是序列循環,可以周遊序列中的所有對象。在下面的例子中,序列循環依次執行字典中的每個值後就停止了循環。

有時候,需要跳出循環,可以使用break語句或continue語句來實作。break語句跳出最近的封閉循環,即跳出目前的循環代碼塊;continue語句跳回到目前封閉循環的頂部,根據條件繼續執行循環代碼塊。這兩個語句可以在代碼塊的任何地方出現。

3.try語句

try 語句是用來處理異常的複合語句。異常是一種控制程式的進階手段,它可以截斷程式或抛出錯誤,python既可以截斷程式也可以抛出異常。當代碼出現錯誤時,python會自動抛出異常,此時需要程式員捕獲這個自動抛出的異常,并決定是否處理它。異常也可以通過代碼手動抛出,在這種情況下,需要提供一個異常處理程式來捕獲這些手動抛出的異常。

try語句有兩種基本類型:try/except/else和try/finally。基本的try語句以try為首行,後跟縮進的代碼塊,之後是一個或多個可選擇的except子句,用來命名捕獲的異常,最後是一個可選的else子句。

try/except/else語句的工作原理如下:當代碼執行到try語句時,python會标記已進入一個try代碼塊,如果執行try子句時抛出一個異常,程式就會跳轉到except語句。如果找到與異常比對的except語句,就會執行該except子句,此時,try/except/else語句執行完畢,這種情況下不執行else語句。如果沒有異常抛出,則try子句中的每個語句都執行,然後代碼指針跳到else語句并執行其中的代碼,執行完成後跳出整個try代碼塊,繼續執行下一行代碼。

try語句的另一種類型是try/finally語句,它可以保證操作的完成。當在try語句中使用finally子句時,不管是否有異常抛出,該子句最後總會執行。

try/finally語句的工作原理如下:如果有異常抛出,python先執行try子句,然後執行except子句,最後執行finally子句,執行完整個try語句後繼續執行後面的代碼;如果執行過程中沒有異常抛出,則先執行try子句,然後執行finally子句。無論代碼是否抛出異常,try/finally語句都可以保證某個操作總會發生。例如,關閉檔案或斷開資料庫連接配接等清理操作通常放在finally子句中,以確定無論代碼是否抛出異常,它們都會被執行。

4.with語句

當有兩個相關操作需要作為代碼塊中的一對操作來執行時,可以使用with語句。with語句常用于打開、讀取和關閉檔案。打開和關閉檔案是一對相關操作,而讀取檔案和對檔案内容進行操作是這對相關操作之間執行的操作。當編寫arcgis地理處理腳本時,with語句常與arcgis 10.1新引入的遊标對象一起使用。後面的章節将會詳細講解遊标對象,在這裡僅作簡單介紹。遊标是要素類或表的屬性表中的記錄在記憶體中的副本。遊标操作有3種類型:插入遊标可以插入新記錄;搜尋遊标可以對記錄建立隻讀的通路權限;更新遊标可以編輯或删除記錄。遊标對象可以用with語句打開和自動關閉,并能以某種方式進行操作。

with語句可自動關閉檔案或遊标對象,就像是使用try/finally語句一樣,但with語句的代碼行更少,這使得編碼更加簡潔和高效。在下面的代碼示例中,示範了使用with語句實作建立新的搜尋遊标、從遊标中讀取資訊以及隐式關閉遊标等操作。

5.語句縮進

編寫代碼時要特别注意語句的縮進,因為它對python解釋代碼起着至關重要的作用。python的複合語句使用縮進來建立代碼塊,這些複合語句包括if/then、for、while、try和with語句等。python解釋器會根據縮進來檢測代碼塊。複合語句首行以冒号結尾,之後所有的代碼行應縮進相同的距離。可以使用任意數量的空格來定義縮進,但每個代碼塊應使用相同級别的縮進,通常的做法是用〈tab〉鍵來進行縮進。當python解釋器遇到代碼行的縮進少于上一行時,就會認為該代碼塊已結束。下面的代碼通過try語句說明了這一概念,try語句後的冒号表明後面的語句是複合語句的一部分,應當縮進,這些語句形成一個代碼塊。

此外,if語句包含在try語句中,這也是一個首行以冒号結尾的複合語句。是以,if語句中的任何語句都應進一步縮進。可以看到,下面的代碼中if語句下有一條語句沒有縮進,而是和if語句處于同一水準,這表明statement4是try代碼塊的一部分,而不屬于if代碼塊。

javascript、java和.net等許多語言使用花括号來确定代碼塊,但python使用縮進而不是花括号,這是為了減少代碼編寫量,增強代碼的可讀性。包含許多花括号的代碼往往難以閱讀,任何使用過其他語言的人對這一點都應該深有體會。不過,縮進确實需要一些時間來适應。

1.3.7 檔案i/o(輸入/輸出)

在日常工作中,讀者會經常需要在檔案中讀取或寫入資訊。python有一種内置的對象類型,為多種任務提供了通路檔案的方法。這裡隻介紹部分檔案操作的功能,其中包括最常用的功能,如打開和關閉檔案,在檔案中讀取和寫入資料等。

python的open()函數能夠建立一個檔案對象,它可以作為一個連結打開計算機的本地檔案。在檔案中讀取或寫入資料之前,必須調用open()函數。open()函數的第1個參數是要打開檔案的路徑,第2個參數對應一個模式,通常是讀模式(r)、寫模式(w)或追加模式(a)等。“r”表示對打開檔案進行隻讀操作;“w”表示對打開檔案進行寫入操作,打開一個已有的檔案進行寫入操作時,會覆寫檔案中原有的資料,是以必須謹慎使用寫模式;追加模式(a)在打開一個檔案進行寫入操作時,不會覆寫原有的資料,而是在檔案的末尾追加新的資料。下面是一個使用open()函數以隻讀方式打開文本檔案的代碼示例。

注意上述代碼示例也使用了with關鍵字來打開檔案,以確定執行完代碼後清理檔案源。

打開一個檔案後,可以使用多種方法讀取檔案中的資料。最常用的方法是使用readline()方法從檔案中一次讀取一行資料。readline()函數可以把一次讀取的一行資料寫入一個字元串變量。可以在python代碼中建立一個循環來逐行讀取整個檔案。如果要将整個檔案讀入一個變量,可以使用read()方法,它會讀取檔案直到遇到檔案結束标記(eof),還可以使用readlines()方法讀取檔案的全部内容,把每行代碼存儲為單個字元串,直到遇到eof。

在下面的代碼示例中,先用隻讀模式打開了“wildfires.txt”文本檔案,并使用 readlines()方法,将檔案的全部内容讀入一個名為“lstfires”的變量,該變量是一個python清單,檔案的每行存儲為清單中的單獨字元串。wildfire.txt檔案是一個用逗号分隔的文本檔案,包含火災點的經度和緯度以及每個火災的置信度。然後循環周遊“lstfires”的每行内容,并使用split()函數根據逗号提取經度、緯度和置信度。最後用經度和緯度建立新的point對象,并使用插入遊标将其插入到要素類中。

與讀取檔案一樣,把資料寫入檔案的方法也有很多。write()函數是最容易使用的方法,隻需要一個字元串參數就可以将其寫入檔案。writelines()函數可以把清單結構的内容寫入檔案。在下面的代碼示例中,建立了一個名為“fclist”的清單,其中含有一系列的要素類,可以用writelines()方法将這個清單寫入檔案。