在
上一節 介紹了 JSON 資料的基本架構後,我們將改寫並擴充
密碼產生器 程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
以JSON格式儲存密碼
在 save_password() 函數中,當輸入欄位確認就緒後,開始進入儲存密碼的核心程式,主要差異點如下:
新增的帳密資料以字典取代串列做為儲存的變數。
password_data_list = []
password_data_list.append([name, url, username, password])
修改成
new_password_data = {
name: {
"url": url,
"username": username,
"password": password
}
}
2. 以 JSON 格式取代 CSV 格式將帳密資料存入檔案。
with open("password_data.csv", mode="a", newline="") as password_file:
password_data = writer(password_file)
password_data.writerows(password_data_list)
修改成
with open("password_manager.json", "r") as password_file:
password_data = json.load(password_file)
password_data.update(new_password_data)
with open("password_manager.json", "w") as password_file:
json.dump(password_data, password_file, indent=4)
將帳密資料存入 password_manager.json 檔案,其中 update() 方法將新增的字典鍵值對更新到從 JSON 檔案讀出的字典。
3. 當 password_manager.json 檔案不存在時,例如第一次儲存帳密資料,我們以在
異常處理 一節中討論過的「try - except - else - finally」框架,對程式做進一步強化。因此,上述 1、2 部分的程式會再改寫如下:
new_password_data = {
name: {
"url": url,
"username": username,
"password": password
}
}
try:
with open("password_manager.json", "r") as password_file:
password_data = json.load(password_file)
except FileNotFoundError:
with open("password_manager.json", "w") as password_file:
json.dump(new_password_data, password_file, indent=4)
else:
password_data.update(new_password_data)
with open("password_manager.json", "w") as password_file:
json.dump(password_data, password_file, indent=4)
finally:
name_entry.delete(0, END)
url_entry.delete(0, END)
username_entry.delete(0, END)
password_entry.delete(0, END)
到目前為止,執行程式的過程及介面和之前完全相同,惟在點選「儲存密碼」後生成 JSON 檔案,將帳密資料以 JSON 物件的格式儲存。
產生password_manager.json檔案
搜尋密碼
基於以上改寫,這裡便可以利用 JSON 資料的格式來對已儲存的密碼進行搜尋。首先,先在圖形介面上新增一個「搜尋」按鈕,當此按鈕被點選後,觸發一段程式執行搜尋密碼的功能。
search_password_button = Button(text="搜尋", width=12, command=search_password)
search_password_button.grid(row=0, column=6, columnspan=2, sticky=E)
在此,我們將搜尋密碼的功能包裝為 search_password() 方法,此時介面如下:
當 search_password() 方法被觸發後,先抓取「名稱」欄位內由使用者所輸入的字串,確認字串存在後,同樣套用「try - except - else - finally」框架,嘗試開啟 password_manager.json 檔案,若該檔案不存在即跳出警告,並結束函式流程;若成功開啟,則檢查載入資料的鍵 (key) 是否含有該名稱,並將搜尋結果顯示在對話方塊。
def search_password():
name = name_entry.get()
if len(name) == 0:
messagebox.showwarning(title="警告", message="請確認名稱是否為空白!")
else:
try:
with open("password_manager.json", "r") as password_file:
password_data = json.load(password_file)
except FileNotFoundError:
messagebox.showwarning(title="警告", message="檔案不存在!")
else:
if name in password_data.keys():
url = password_data[name]["url"]
username = password_data[name]["username"]
password = password_data[name]["password"]
messagebox.showinfo(title="搜尋結果", message=f"名稱:{name}\n網址:{url}\n帳號:{username}\n密碼:{password}")
else:
messagebox.showinfo(title="搜尋結果", message=f"此名稱資料不存在!")
執行後,由於在前一節中我們已儲存一組名稱為「Google」的帳密資料,執行搜尋後可將剛剛所儲存的內容顯示出來;若搜尋不存在的名稱,例如下方所測試的「Apple」,則跳出警告視窗。
總結
在這篇文章中,我們在密碼產生器原有產生隨機密碼與儲存帳密的功能外,利用 JSON 資料具有字典格式的結構,實作出可自動搜尋帳密的功能,並引入異常處理的流程,讓整體功能更加完備,也有較高的容錯率。
程式範例