Python 入門指南- 單元26 - 存檔與載入 - 程式語言教學誌
文章推薦指數: 80 %
這是個相對簡單的方式,也就是說, Encrypt 類別(class) 的code 屬性(attribute) 為密碼表字串,然後把這個字串儲存到一個固定檔名的純文字檔裡,就完成存檔的工作了。
Python入門指南
單元26-存檔與載入
~~學習進度表~~
存檔要儲存什麼呢?直覺告訴我們應該要儲存Encrypt物件(object),不過可以簡單點,儲存密碼表就可以了
Encrypt→code
↓
code.txt
完整程式請參考「範例程式碼」的encrypt.py、encrypt_view.py及encrypt_controller.py。
要直接儲存整個Encrypt物件到檔案也不是不可以,只是這麼一來就牽涉到物件還要序列化(serialization),反倒因為密碼表是字串(string),因此可以字串的方式來存檔。
儲存物件要利用標準程式庫(standardlibrary)中的pickle模組(module)。
這是個相對簡單的方式,也就是說,Encrypt類別(class)的code屬性(attribute)為密碼表字串,然後把這個字串儲存到一個固定檔名的純文字檔裡,就完成存檔的工作了。
載入就讀取這個純文字檔,取得密碼表字串再重新建立e,並以密碼表字串當__init__()方法(method)的參數即可。
概念很簡單,可是跑程式時可能也會發生某些問題,例如e的初值為None的情況,如果使用者沒有按過新建就按下儲存,程式就會發生錯誤,因此這邊也要先進行條件檢查。
sm()方法的實作如下
#按下儲存按鈕的事件
defsm(self):
#先測試是否有按過新建按鈕
ifself.e==None:
m="無法儲存!"
self.app.dt["text"]=m
else:
#有按過新建按鈕就進行存檔工作
f=open('./code.txt','w')
f.write("".join(self.e.code))
f.closed
self.app.dt["text"]="完成存檔!"
這裡利用內建函數open()打開並且建立檔案,需要兩個參數(parameter),第一個參數為檔案路徑名稱,第二個參數則是檔案處理模式,這裡'w'表示寫入,若code.txt不存在就會建立檔案
f=open('./code.txt','w')
f取得檔案物件,接著寫入內容到檔案是利用檔案物件的write()方法,參數就是要寫入的字串內容
f.write("".join(self.e.code))
存檔工作結束,先呼叫closed方法關閉檔案物件,最後在訊息欄顯示檔案儲存成功訊息
f.closed
self.app.dt["text"]="完成存檔!"
載入則是讀取code.txt中的內容,因為檔案內容就是密碼表。
不過載入時有可能發生檔案不存在的情況,就是使用者沒有按過儲存按鈕囉!這樣的話,相同目錄下不會存在code.txt檔案,所以這邊也是先做個檔案是否存在的條件檢查,程式如下
#按下載入按鈕的事件
deflm(self):
#先測試檔案是否存在
ifos.path.exists("./code.txt"):
#檔案存在就進行載入工作
f=open('./code.txt','r')
code=f.readline()
self.e=Encrypt(code)
s=str("".join(self.e.code))
m="密碼表:"+s
self.app.dt["text"]=m
else:
m="無法載入!"
self.app.dt["text"]=m
這裡我們先用os.path.exists()判斷檔案是否存在
#先測試檔案是否存在
ifos.path.exists("./code.txt"):
因為用了標準程式庫裡的os模組,所以前面要先importos
importos
若不存在訊息欄就顯示載入失敗的訊息,若存在就進行載入工作,這裡是用檔案物件的readline()方法
code=f.readline()
然後我們將code設定給e即可,這裡同樣e直接建立一個帶有參數的Encrypt物件
self.e=Encrypt(code)
來執行看看囉!下面是存檔
相同目錄下就會新增code.txt
開啟code.txt檢查密碼表是否有存入
下面是載入
功能OK,接下來就剩兩個方法要完成實作囉!
中英文術語對照
物件object
序列化serialization
字串string
標準程式庫standardlibrary
模組module
類別class
屬性attribute
方法method
參數parameter
重點整理
1.存檔可儲存物件或字串,儲存物件須使用標準程式庫中的pickle,儲存字串可將字串直接寫入純文字檔案中。
2.檔案處理利用內建函數open(),取得檔案物件後利用write()方法寫入資料,而readline()可讀取資料,結束檔案處理工作後利用closed關閉檔案物件。
3.os.path.exists()可判斷指定路徑的檔案是否存在。
4.GUI中任何一個動作都應該要顯示提示訊息給使用者,好讓使用者知道操作是否成功。
問題與討論
1.為什麼儲存物件還要序列化,字串也是物件,可是字串卻不用?
2.載入前如果檔案不存在會發生什麼情況?有其他的解決方式嗎?
練習
1.承接上一個單元的hello_controller.py,想一想可以替HelloController擴充什麼功能,像是可以清除原本輸入內容,然後讓使用者重新輸入。
2.承接上一個單元的game_controller.py,相同資料夾中加入單元21完成的guessgame.py,替GameView加入一個視窗元件Text,然後在Text中顯示猜測記錄。
相關教學影片
整合Encrypt類別與實作其他功能⇨YouTube頁面連結
上一頁單元25-整合Encrypt類別
回Python入門指南首頁
下一頁單元27-完成版的EncryptController
回Python教材首頁
回程式語言教材首頁
延伸文章資訊
- 1【Python】取出檔案名稱(含副檔名 - 嗡嗡的隨手筆記
【Python】取出檔案名稱(含副檔名、不含副檔名) os path basename split 取出檔名路徑不要副檔名(內含範例程式碼) sample code · 前言 · 最基本的spl...
- 2Python 搜尋子目錄下檔案+篩選條件walk+fnmatch - iT 邦幫忙
Python os.walk 找檔案很容易,可是天坑也不少。 ... 尋找某目錄(包括子目錄)下全部檔案#--- 傳入參數nPath目錄名稱/ txtFile 將結果存檔#--- 傳回一個lis...
- 3【Python 筆記】 Python 檔案讀寫 - 9notes
按路徑存檔csv
- 4Python — 使用檔案系統. 包含檔案的路徑 - Medium
要在Python中使用檔案系統的話,一般會使用os與os.path模組中的函式。 ... 檔名告知存放資料檔案的名稱與類型、路徑則指示了檔案在電腦中的位置。
- 5檔案存取
tags: `python` # 檔案存取## 路徑* 相對路徑: * 以目前python程式碼檔案所在位置為基準,標示另外檔案所在位置* 開發專案建議使用相對.