Python學習日誌-檔案讀取、寫入、模式比較(r+、a+、w+)

Kayden
Dec 26, 2020

前言

內文為自行查看書籍、查閱網路資訊,或者利用程式自行嘗試後,進行整理幫助自我理解的學習日誌,並無商業行為,內容大多轉載於書籍以及他人的分享,來源皆附於文章下方的參考資料。此外內容表達的為自我的理解與解釋,並不保證一定正確,請僅以參考視之,若有錯誤歡迎告知。

檔案的讀取與寫入,剛開始學習時總覺得很簡單,畢竟是個基礎的技能,但練習時常常忘記一些小細節,甚至出現Error,而又在找尋問題的解決過程中花費了許多時間,今天就來紀錄一下學習中的小細節、遇到的問題、解決方法以及程式背後的概念。由於內容繁多將會分成2篇文章。

在 Python 中讀寫檔案的語法為:
檔案物件 = open(檔案路徑, mode = 開啟模式)
檔案物件:利用檔案物件操作檔案

有了檔案物件後,就可以對檔案進行各種需要的操作,像是印出檔案中的內容、將檔案覆寫、在檔案後方新增其他文字等等,而要進行這些操作的方法為(如表1):

表1

python 在讀取檔案時的操作步驟為開啟檔案→檔案操作(讀取內容/寫入內容)→關閉檔案,一定要記得關閉檔案,如果不關閉檔案,可能會導致檔案臨時數據丟失,造成檔案寫入失敗。因為檔案的數據在關閉以前都不會儲存在硬碟裡,而是儲存在運行的內存當中,關閉了才會寫入硬碟,此外若不關閉檔案會浪費系統的分配。

使用兩種範例才呈現這個步驟,範例2使用了with陳述,使用with的好處在於當檔案操作完,程式會自動的關閉檔案,可以避免忘記關閉檔案,故大多數都推薦使用這個方式去讀寫檔案。

使用範例1:

f = open('try open.txt', mode='r')  # 開啟檔案
data = f.read() # 讀取檔案
f.close() # 關閉檔案

使用範例2:

with open('try open.txt', mode='r') as f: 
data = f.read() # 讀取檔案

題外話,使用”讀寫檔案”的感受在 Python 與 R 中就不一樣,R不用特別注意有沒有開啟關閉檔案,直接 read.table 或 read.csv 就把檔案讀取了,write.table 或 write.csv 就把檔案匯出,一整個很直覺 XDD,不過 Python 的運作過程讓人有種更瞭解背後的運作模式的FU~~

各個開啟模式下需注意的事項

練習常見的方法( f.read()、f.write()、f.seek()、f.tell() )與模式(r+、w+、a+)

開啟模式如表2

表2

新增的註解:
'r'、'r+' :只讀或讀寫,並不創建檔案
'w'、'w+'、'a'、'a+',若檔案不存在都會新建檔案。
'w'、'w+' 只寫或讀寫,兩者都等同新建一個檔案,故會把原內容清除。
'w+' 與 'r+'的區別:'r+'只能使用在文件存在情況,不存在報Error。

各個練習的差異:

由上述可以知道在 'a' 跟 'w' 的模式下,檔案不存在的話,將會新建檔案,故下方的練習比較,都將是在檔案已存在之下進行的。先建立一個 try open and write.txt,其內容如圖1

圖1

練習1:模式r+,先讀取再寫入

因為檔案中有中文,故需使用 encoding=’utf-8-sig’,後續在說明 encoding 的意義,此處先不深究。由練習1的輸出結果可以看到,有成功的讀取檔案內容並存至變數 data 中,而從txt檔案中也可看見寫入成功。

練習1

練習2:模式r+,只寫入不讀取

此時檔案為練習1執行之後的檔案,再次執行 f.write(“\n — — — — — — — — — \n以下為寫入測試\n成功寫入。”),但此次不再執行讀取。

練習2

從結果可以看到執行練習1程式碼後的檔案中的前四行的文字被覆蓋掉了,那明明都是「f.write()」,並且寫入一樣的文字,為什麼練習1的沒被覆蓋掉了,而練習2的卻被覆蓋掉了?

原因:寫入時檔案中浮標位置不一樣!
在練習1中,最一開始時檔案游標在檔案的開頭,但程式碼先進行了讀取,此時檔案游標跑到了檔案的最末端,因此在進行寫入時,是從檔案的最末端進行寫入,也就沒有覆蓋掉原本的文字。而練習2時,因為沒有進行讀取,所以檔案游標在檔案的最開頭,因此進行寫入時,原本的文字就被覆蓋掉了。

練習3:模式w+,先讀取再寫入

為了方便進行比較,將檔案回復至起始樣子(圖1)

練習3

練習3結果可以看到,輸出結果是空的,表示沒有讀取到,並且在執行後的檔案中,只存在寫入的文字,驗證了檔案「被新建」了。進一步確認是否是游標的問題

從測試結果可以看到,游標位置始終在第0個字元,並未移動,因此可以確認沒有讀取並非游標的問題。

練習4:模式w+,先寫入再讀取

為了方便進行比較,將檔案回復至起始樣子(圖1)。
由練習4結果可以看到有成功 print(data),因此對於 'w+' 模式進一步理解為必須先進行寫入,才能再進行讀取。

練習4

練習5:模式a+,先讀取再寫入

為了方便進行比較,將檔案回復至起始樣子(圖1)。
由練習5的輸出結果可以看到由於游標位置在檔案最末端,因此沒有正確的讀取到檔案內容,而檔案內容可以看到,原本的文字並沒有被覆蓋掉。

練習6:模式a+,先寫入再讀取

為了方便進行比較,將檔案回復至起始樣子(圖1)。
有此可以知道 ‘a+’ 模式之下,預設的游標會設定在檔案的最末端

參考資料:

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

No responses yet

Write a response