跳到主要內容

Python筆記(10)-檔案的讀取與寫入(Text檔)

我們在進行資料處理時,常常會需要讀取各式各樣的檔案,也會匯出特定的檔案,這一節我們針對文字檔(Text)的讀取與寫入進行說明。

10.1 文字檔的讀取與寫入

我們利用open()函數進行文字檔案的讀取與寫入,在程式的寫法中有兩種,以下簡單說明一下:

第一種:

f = open(檔案名稱,模式,編碼方式)

檔案操作相關程式

f.close()

第二種:

with open(檔案名稱,模式,編碼方式) as f:

        檔案操作相關程式

第二種的寫法不需f.close(),程式執行完會自動關閉檔案。

open()函數終的模式有數種選擇,有只能讀取、只能寫入或同時可以讀取與寫入,我們將其整理成以下表格:

以下我們針對每一個模式的使用加以說明,在說明前,我們先在資料夾中建立兩個檔案,內容為中文字與英文字,如下圖所示,我們等等會讀取並寫入這兩個檔案。

程式碼

import os

os.getcwd()

os.chdir("D:/Bolg資料/Python/Python(10)")

#開啟文字檔並印出內容(1) [需要close()函數]

eng_article="eng-article.txt"

chinese_article="chinese-article.txt"

f2=open(chinese_article,"r",encoding="Big5")

print(f2,end="\n")

i=0

for row in f2:

    print("Line{}:{}".format(i,row))

    i+=1

f2.close() 

Python畫面

程式碼

#開啟文字檔並印出內容(2) [不需要close()函數]

with open(eng_article,"r") as f11:

    j=0

    for row in f11:

        print("Line{}:{}".format(j,row))

        j+=1

Python畫面

程式碼

#先寫入再讀取

with open(chinese_article,"r+",encoding="Big5") as f3:  #游標在第一列

    f3.write("!寫入測試!") #會覆蓋原有的文字

Python畫面



程式碼

#寫入內容於文字檔(1) [mode=r+]

#先讀取再寫入

with open(chinese_article,"r+",encoding="Big5") as f3: 

    k1=0;print("先讀取再寫入".center(20,"="))

    for row1 in f3:

        print("{}列:{}".format(k1,row1))

        k1+=1

    f3.write('!寫入測試!')  #游標已在最後一列

Python畫面

for 迴圈每執行一次即讀取一次,讀取時游標會跟著移動,所以當整份文件讀取完後,游標就會停在內容的尾端,此時寫入內容時,就會接在原內容的尾端。我們也可以用seek函數去移動游標位置,以下說明一下seek()函數的使用方式。

f.seek(偏移位置,游標位置)

游標位置為

        0表示游標在內容的最前端。(預設)

        1表示游標在目前位置。

        2表示游標在內容的最尾端。

偏移位置表示從游標位置算起,相對的偏移位置。(預設為0)

我們也可以利用tell()函數知道目前游標所在的位置,在內容的最前端位置為0

程式碼

with open(chinese_article,"r+",encoding="Big5") as f3: 

    f3.seek(0,2) #游標已在最後一列

    f3.write('!寫入測試!')

Python畫面

程式碼

#寫入內容於文字檔(2) [mode=w]

String='''你好,我叫Shawn,目前任職於XX科技品管部門!'''

with open("Mode_w-test.txt","w",encoding="Big5") as f4:

    f4.write(String)

    #print(f4.read())  #不可讀取,產生Error

Python畫面

程式碼

#寫入內容於文字檔(3) [mode=w+]

String='''Hello,我叫Shawnh,目前任職於XX科技品管部門!'''

with open("Mode_w-test.txt","w+",encoding="Big5") as f5:

    f5.write(String)

    f5.seek(0)        #將游標移至標頭

    String2 = f5.read()  #可讀取

    print("讀取的內容為:"+String2)

Python畫面

程式碼

#rw的應用(更新第一列的內容)

with open(chinese_article,"r",encoding="Big5") as f6:  #游標在第一列

    print("更新前的內容:\n" + f6.read())

    f6.seek(0)

    content=f6.readlines()

with open(chinese_article,"w+",encoding="Big5") as f6:  #游標在第一列

    content[0]="!更新列!\n"

    f6.writelines(content)

    f6.seek(0)

    print("更新後的內容:\n" + f6.read())

Python畫面


rw的應用中,我們用到了readlines()函數,此函數可以內容轉換成一個陣列,陣列中的元素為內容中的每一列,透過陣列的相關操作,將修改好的陣列在寫入文件(利用writelines()函數)中,達到文件更新的效果。

程式碼

#寫入內容於文字檔(4) [mode=a]

with open("Mode_w-test.txt",mode="a",encoding="Big5") as f7:

    f7.write("!寫入測試!")

    f7.read() #不可讀取,產生Error 

Python畫面

程式碼

#寫入內容於文字檔(5) [mode=a+]

with open("Mode_w-test.txt",mode="a+",encoding="Big5") as f8:

    f8.write("\n!寫入測試!") #換行寫入

    f8.seek(0)

    print(f8.read()) #可讀取。

 Python畫面 




10.2 二進位檔案的讀寫

如果檔案的副檔名為.bin,就是二進位檔案,內容全是二進位編碼,我們要如何開啟並解譯其內容,我們以下進行說明:

我們首先先利用open函數創造出一個二進位檔案,再說明如何讀取二進位檔案。

程式碼

#寫入二進位檔案

String='''你好,我叫Shawn,目前任職於XX科技品管部門!\n請大家多多指教...'''

with open("Mode_wb+-test.bin",mode="wb+") as f10:

    f10.write(String.encode("Big5")) #先進行二進位編碼(encode)再寫入

    f10.seek(0)

    print("二進位內容:"+ str(f10.read()))

    f10.seek(0)

    print("解碼後內容:"+ f10.read().decode("Big5")) #將二進位內容進行解碼(decode)

Python畫面


要創造一個二進位檔案,其實就是用寫入模式,但是因為要建立二進位檔案,在模式上面我們會寫成wbwb+,如果是要讀取就要寫成rbrb+,這就是要特別注意的地方。這裡我們會發現,直接時使用read()函數呈現出來的結果會是一串二進位編碼,這是因為檔案本身位二進位檔案的緣故。若要解譯其內容就是要使用decode(編碼模式)函數進行解譯,我們這邊因為內容為中文,所以我們使用Big5的編碼模式進行解譯。

 程式碼

#讀取二進位檔案

with open("Mode_wb+-test.bin", mode="rb") as f11:

    print(f11.read().decode("Big5"))

Python畫面

留言

這個網誌中的熱門文章

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(2) - 字串分割(String.Split())與合併(String.join())

在資料清理中,我們常常需要對字串進行分割或合併,今天來簡單介紹 Uipath 中字串如何進行分割與合併。 1.      字串分隔 ( 單一分割符號 ) 我們首先建了一個字串變數 Str1= "Jimmy,Johnson,Shawn,Alan,Nick" ,我們現在想把這些人名一個一個切割出來,很明顯只要將 ”,” 作為分個符號就可以了。這邊我們建立一個陣列變數 Str1_Array=Str1.split(","c) ,這個陣列變數就會儲存分割出來的結果。我們接下來用 For each 與 Write Line 將陣列的每一項內容印出來,就可以知道我們分割的結果有沒有成功。 2.      字串分隔 ( 多個分割符號 ) 我們首先建了一個字串變數 Str2= "Jimmy,Johnson.Shawn Alan,Nick" ,我們現在想把這些人名一個一個切割出來,很明顯要將 ”,” 、 ”.” 、 ” “ 都作為分個符號才能完整分割。這邊我們建立一個陣列變數 Str2_Array= Str2.Split(",|.| ".ToArray()) or Str2.Split({","c,"."c," "c}) ,這個陣列變數就會儲存分割出來的結果。我們接下來用 For each 與 Write Line 將陣列的每一項內容印出來,就可以知道我們分割的結果有沒有成功。 3       字串的合併 (Array 字串元素合併 ) 我們首先建了一個字串變數 Str3_Array= {"John","Jimmy","Shawn","Alan"} ,我們現在想把這些人名中間用 ”|” 符號隔開並且變成一個字串,這裡我們是用 String.Join( 連接符號 , 陣列 ) 這個函數達到這個目的。我們建立一個變數 Str3_Join ,使 Str3_Join=String.Join("|", Str3_Array) ,此時 Str3_Join 的結果就會是 John|Jimmy|Shawn|Alan 。我們接下來用 Write...

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...