跳到主要內容

Python筆記(3)-字串的運算與字串格式化

 3.1 字串的運算

在Python中,針對兩個字串進行+與*,分別代表字串相接與字串重複的功能,我們用以下用兩個例子進行說明:

程式碼

#字串相接

str1="abc"

str2="123"

print("str1與str2相接結果:",str1+str2) 

Python畫面


程式碼

#字串重複

print("字串@重複10次:","@"*10)

Python畫面

程式碼

#字串與數字相接

older=33

print("我今年"+older+"歲")    #<--錯誤寫法

print("我今年"+str(older)+"歲") #<--正確寫法

Python畫面

在第3個範例中顯示了字串與數字相接的方式,因為資料型態不同,直接用+運算會出現程式執行錯誤。解決方式是將數字轉換成字串,此時會用到str()函數,此函數可以將數值資料型態的變數轉換成字串,故str(older)會將數字33轉換成字串33,也就是"33"。此時"我今年"+str(older)+"歲"的語法就不會出現錯誤了。這個是初學者常常會忽略的地方,需要特別注意。

<補充>:資料型態轉換函數

3.2 字串中是否含有特定字串的判定

我們常常需要置到一個字串中是否有出現或沒有出現某一個字串,此時會用到in與not in的語法來判定,結果會是一個布林值。我們用以下例子說明:

程式碼

#字串中是否含有特定字串的判定

sentences="An apple a day, keep doctor away."

print("apple是否在句子中:","apple" in sentences)

print("orange是否在句子中:","orange" in sentences)

Python畫面

3.3 字串相關函數

我們在進行資料分析時常常需要進行資料清洗,此時針對字串的部分就需要依靠許多相關函數將字串中不必要的符號移除或修改,以下列出常用的字串函數並說明每一個的使用方式。


程式碼

#大小寫轉換

str1="hello, how are you?"

print("str1 轉大寫:",str1.upper())

print("str1 轉小寫:",str1.lower())

print("str1 字串中第一個字母轉大寫:",str1.capitalize())

print("str1 字串中每一個詞的第一個字母轉大寫:",str1.title())

print("str1 字母都是大寫嗎?", str1.isupper())

print("str1 字母都是小寫嗎?", str1.islower())

Python畫面


程式碼

#判斷字串開頭與結尾

str2="@123abc*"

print("str2 開頭是否為@?",str2.startswith("@"))

print("str2 開頭是否為*?",str2.startswith("*"))

print("str2 結尾是否為@?",str2.endswith("@"))

print("str2 結尾是否為*?",str2.endswith("*"))

Python畫面

程式碼

#移除字元

str3="@123abc***"

str4="--123abc--------"

print("移除str3左邊@:",str3.lstrip("@"))

print("移除str3右邊*:",str3.rstrip("*"))

print("移除str4左邊-:",str4.lstrip("-"))

print("移除str4右邊-:",str4.rstrip("-"))

print("移除str4兩端-:",str4.strip("-"))

Python畫面

程式碼

#字串對齊

str5="Hello, welcome to python world!"

print("置中對齊,長度60,長度不足左右以=符號補齊")

print(str5.center(60,"="))

print("靠左對齊,長度60,長度不足右邊以=符號補齊")

print(str5.ljust(60,"="))

print("靠右對齊,長度60,長度不足左邊以=符號補齊")

print(str5.rjust(60,"="))

Python畫面

程式碼

#字元替換

str6="a,b,c,d,e"

print("將str6中的\",\"替換成\"-\":",str6.replace(",", "-"))

print("將str6中的\",\"移除:",str6.replace(",", ""))

Python畫面

程式碼

#字串分割

str7="Three competing store owners rented adjoining shops in a mall."

str7=str7.replace(".", "")

print("str7句子中出現了以下單字:",str7.split(" "))

Python畫面

此例子值得好好說明一下,我們的目的是要將一段句子中的英文單字擷取出來,但在一段句子中可能會出現標點符號,譬如, 或 .,此時在擷取單字之前不需先將此句子中的標點符號移除,我們這邊用replace()函數將句尾的句號移除,移除後的字串在重新指定回相同的變數str7,此時str7就更新為沒有句號的句子,此時我們用split()函數以空格" "做為切割點進行切割,即可將所有出現的單字擷取出來。split()函數回傳的結構為列表(list)資料型態,此資料型態的操作後續會介紹。

程式碼

#計算特定字串出現的次數

str8="aaa-bb-c"

print("str8句子中a出現次數:",str8.count("a"))

print("str8句子中b出現次數:",str8.count("b"))

print("str8句子中c出現次數:",str8.count("c"))

print("str8句子中-出現次數:",str8.count("-"))

print("str8句子中@出現次數:",str8.count("@"))

Python畫面

程式碼

#字串長度、擷取特定位置字串、特定字串出現的位置

str9="a123456@yahoo.com.tw"

print("str9字串長度為:",len(str9))

print("str9中@的位置位於:",str9.find("@"))

print("str9第一個字元為:",str9[0])

print("str9第一個字元為:",str9[0:1])

print("str9前兩個字元為:",str9[0:2])

print("str9前三個字元為:",str9[0:3])

print("str9中第5個位置之後的字串:",str9[4:])

print("str9倒數第一個字元:",str9[-1])

print("str9倒數第二個字元:",str9[-2])

print("str9中倒數第5個位置之後的字串:",str9[-5:])

print("E-mail帳號為:",str9[0:str9.find("@")])

print("E-mail種類為:",str9[str9.find("@")+1:])

Python畫面

程式碼

#字串連接

pathlist=["C:","doc1","doc2","file.txt"]

fullpath="/".join(pathlist)

print("資料路徑:{}".format(fullpath))

Python畫面

3.4 字串格式化

字串格式化的方法可以用來排版字串列印結果,使列印出來的結果更為乾淨整齊,使讀者一目了然。以下先說明基本的語法與功能,並舉例說明。

基本語法:字串.format(變數1, 變數2, 變數3,…)

表格中的s代表字串; d代表整數; f代表浮點數。

程式碼

#字串格式化輸出

name="Andy"

math_s=25.8

english_s=100

ave=(math_s+english_s)/2

print("未使用字串格式化".center(30,"="))

print("姓名","數學成績","英文成績","平均")

print(name,math_s,english_s,ave)

print("使用字串格式化".center(30,"="))

print("{:4s}{:6s}{:6s}{:4s}".format("姓名","數學成績","英文成績","平均"))

print("{:6s}{:<9.2f}{:<9.2f}{:<9.2f}".format(name,math_s,english_s,ave))

Python畫面

從上面範例中,可以看的字串格式化的結構中,字串中的{}數量與format()內的變數是一對一對應的且可在{}中設定呈現的方式,藉此帶來更清楚的呈現結果。另外,字串格式化的好處是,因為format()中是擺放變數,故變數值更新的時候,呈現結果也會直接更新,這個好處在結合for或while迴圈時,可達到一行print()程式但可以呈現多行結果,稍後介紹for與while迴圈時會加以說明。

留言

這個網誌中的熱門文章

RPA-Uipath筆記(1) - 如何從網路上下載資料並存至指定路徑

最近在做 RPA 相關專案時遇到了這個問題: 如何從網路上下載資料並存至指定路徑? 針對這個問題我們採取的解決方案是 先讓檔案下載到電腦的預設路徑,再將檔案移動到我們指定的資料夾 。 以下我們用下載政府公開資料平台的資料 ("https://data.gov.tw/dataset/116285") 為例, Uipath 的流程建立如下: 使用到了 Wait for Download 、 Move File 、 Delete File 三個 Activity , Wait for Download 中 Monitored folder 必須放瀏覽器中設定的下載檔案的預設路徑且關閉詢問儲存位置。 Downloaded file 則是設定一個變數名稱 downloadfile( 可自訂 ) ,此變數的資料型態是 FileInfo 。中間則放入下載的流程步驟,從下載開始到結束都會在此 Activity 中執行完畢,執行完後所下載的檔案的相關資訊都會被存放在變數 downloadfile 中。 接下來是將檔案從預設下載路徑中移至指定路徑,這裡就需要下載預設路徑與指定路徑,這兩個我們在流程一開始就建了了兩個變數 dnlo_path 、 asng_path ,寫法如下: dnlo_path = "C:\Users\" +system.Environment.UserName+ "\Downloads" system.Environment.UserName à VB 語法,代表目前電腦的使用者名稱。 asng_path = "D:\Bolg 資料 \Uipath\Uipath(1)" Move File Activity 中 From 要放入目前檔案的位置; To 則要放入檔案存放的指定的位置,但因為是要做檔案的移動,所以以上兩個路徑後面都要再加上檔案名稱,這時可以使用 downloadfile 這個變數的屬性值叫出檔案名稱( downloadfile.Name ),當檔案名稱是隨機變動的時候,非常好用。另外,特別值得注意的是, To 的部分在加上檔案名稱時,可以不用用原始檔案的名稱,這時可以同時達到修改檔名的效果。 Overwrite 的部分打勾代表再重複執行一次的時...

RPA-Uipath(5)-如何讀取Mail與取得Mail的資訊

本篇主要介紹 Uipath 取得 mail 相關資訊與附件的方法,因為 mail 的種類眾多,本範例以 Gmail 為例。首先在使用 Uipath 取得 Gmail 相關資訊前須對 Google 帳戶的安全性進行兩階段驗證設定,設定方式如下: Step1. 點選 ” 管理你的 Google 帳戶 ” Step2.  點選 ” 安全性 ” à ” 兩階段驗證 ” à 點選 ” 開始使用 ” Step3.  依 Google 所提示步驟,您最後會取得一組密碼,請務必將此密碼記下。 接下來要開始使用 Uipath 擷取 mail 相關資訊,一開始我們先使用 Get Password 儲存 mail 登入的密碼,此時密碼不是使用您真正的密碼而是使用剛剛兩階段驗證後取得的密碼,並儲存於變數 password 。 接下來使用 Get IMAP Mail Messages 來取得 mail 的相關資訊,在使用 Get IMAP Mail Messages 時必須在其屬性設定區塊進行一些參數設定。 Port 欄位填入 993 , Server 欄位填入 "imap.gmail.com" , Email 欄位填入您的 Email , Password 欄位填入 變數 password , Message 欄位我們用 MailMessage 變數填入 Mail 的相關資訊都會存在 MailMessage 變數中,我們可以用 For Each 迴圈逐一取得 mail 的相關資訊。 For Each 的屬性區塊部分也需要進行一些參數設定, List of item 欄位需填入 MailMessage 變數, TypeArgument 則須設定為 System.Net.Mail.MailMessage 。 設定完成後,我們先用 Write Line 將信件的主旨印出做為測試( 這邊我們只印出前 5 封信件的主旨,可在 Get IMAP Mail Messages 的屬性區塊中 Top 欄位中設定 ),如果要印出信件主旨,需要用 item.Subject 屬性,如要印出其他資訊,我們將常用的幾個列在以下表格: 最後,有些信件會附帶一些附件,我們如何將這些物件儲存下來呢 ? 這邊只需要用到 Save Attachments 即可。我們將其放在迴圈內以下載每個有附件的 mail...

RPA-Uipath(6)-如何讀取檔案的相關日期與時間

這一篇我們主要要說明如何批次將檔案的 ” 建立時間 ” 、 ” 修改時間 ” 、 ” 存取時間 ” 擷取出來,並整理匯出一個 Excel 表格。 在說明之前,我們簡單說明一下我們要擷取的是那些時間,我們可以針對任一個檔案,按下右鍵,選取內容,就會跳出該檔案的相關資訊,其中就有所謂的 ” 建立時間 ” 、 ” 修改時間 ” 、 ” 存取時間 ” ,如下圖所示,我們的目的就是將這些時間一一擷取出來。 要擷取以上的這些時間,需要用到 FileInfo() 物件,用法如下: 1.      建立時間: new FileInfo( 檔案路徑 ).CraeationTime.ToString( 日期時間格式 ) 2.      最後修改時間: new FileInfo( 檔案路徑 ).LastWriteTime.ToString( 日期時間格式 ) 3.      最後存取時間: new FileInfo( 檔案路徑 ).LastAccessTime.ToString( 日期時間格式 ) 因為我們的範例要批次讀取一個資料夾中多個檔案,所以會用到 Directory.GetFiles( 資料夾路徑 ) ,此函數會回傳資料夾中所有檔案的路徑並以 List 型態儲存。 以下我們說明我們如何用 Uipath 達到此目的: 我們一開始先用 FilePathList 變數儲存資料夾中所有檔案的路徑,建立一個空的 DataTable ,其中我們建立了四個欄位 ”FileName” 、 ”CreationTime” 、 "LastModifiedTime" 、 ”LastAccessTime” 。 接下來,利用 For Each 對每一個檔案,擷取以上四個資訊並分別用四個變數儲存 FileName 、 FileCreationTime 、 FileLastModifiedTime 、 FileLastAccessTime 並將次四個資訊放入 DataTable 中 ( 利用 Add Data Row 的 Activity) 。 For Each 結束後,我們將 DataTable 寫入 Excel 中並存於同一個資料夾,如下圖所示。