不間斷 Python 挑戰 Day 35 - 密碼產生器 - 搜尋功能

更新於 發佈於 閱讀時間約 9 分鐘

上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。

以JSON格式儲存密碼

在 save_password() 函數中,當輸入欄位確認就緒後,開始進入儲存密碼的核心程式,主要差異點如下:

  1. 新增的帳密資料以字典取代串列做為儲存的變數。
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檔案

產生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 資料具有字典格式的結構,實作出可自動搜尋帳密的功能,並引入異常處理的流程,讓整體功能更加完備,也有較高的容錯率。

程式範例

https://github.com/wjweng/marathon_python/tree/master/Day35













留言
avatar-img
留言分享你的想法!
avatar-img
Wei-Jie Weng的沙龍
48會員
36內容數
Wei-Jie Weng的沙龍的其他內容
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
2022/06/01
不管你是程式的新手或老手,不管你是不是第一天寫Python程式,在編譯或執行時絕對有出現程式錯誤或異常的時候,也就是俗稱的「bug」,這對於程式編譯人員是好事,你可以在程式撰寫階段就事先排除這些異常,或是加上捕捉異常的程式區段以及處理程序,讓程式即使出現異常也可以繼續執行。
Thumbnail
2022/06/01
不管你是程式的新手或老手,不管你是不是第一天寫Python程式,在編譯或執行時絕對有出現程式錯誤或異常的時候,也就是俗稱的「bug」,這對於程式編譯人員是好事,你可以在程式撰寫階段就事先排除這些異常,或是加上捕捉異常的程式區段以及處理程序,讓程式即使出現異常也可以繼續執行。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
我們在使用Python語言進行軟體開發時, 常常會需要dict這個資料結構來儲存複雜結構的資料, 就如同JSON一般, 我們會具有這樣的Key/Value模式組成的資料結構, 如下圖: 而當我們在Python的世界裡, 除了嚴謹規範資料欄位的@dataclass之外, 更常使用的就是「di
Thumbnail
我們在使用Python語言進行軟體開發時, 常常會需要dict這個資料結構來儲存複雜結構的資料, 就如同JSON一般, 我們會具有這樣的Key/Value模式組成的資料結構, 如下圖: 而當我們在Python的世界裡, 除了嚴謹規範資料欄位的@dataclass之外, 更常使用的就是「di
Thumbnail
從 JavaScript 到 Python
Thumbnail
從 JavaScript 到 Python
Thumbnail
關於json的資料交換格式請參考「【程式語言 - Javascript】輕量資料格式 JSON」, 我們常常會在使用套件的過程中發現回傳值的型態都會有「dict」的蹤跡, 為什麼呢? 因為動態、彈性、靈活, 不需要預先定義類別來明確指定每個欄位的內容, 但缺點就是文件必須寫清楚內容物是哪些, 否
Thumbnail
關於json的資料交換格式請參考「【程式語言 - Javascript】輕量資料格式 JSON」, 我們常常會在使用套件的過程中發現回傳值的型態都會有「dict」的蹤跡, 為什麼呢? 因為動態、彈性、靈活, 不需要預先定義類別來明確指定每個欄位的內容, 但缺點就是文件必須寫清楚內容物是哪些, 否
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 身為專業的軟體開發者的我們, 除了讓程式會動之外, 也
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 身為專業的軟體開發者的我們, 除了讓程式會動之外, 也
Thumbnail
序列化(serialization)是將資料結構或對象轉換為一個格式,可以被儲存到文件或記憶體中,或者可以透過網路傳輸到另一個系統環境。這使得資料可以在不同的系統之間進行交換,並在需要時重新建構回原始的資料結構。本文將介紹兩個好用的Python套件-JSON與Pickle,並比較兩者的不同。
Thumbnail
序列化(serialization)是將資料結構或對象轉換為一個格式,可以被儲存到文件或記憶體中,或者可以透過網路傳輸到另一個系統環境。這使得資料可以在不同的系統之間進行交換,並在需要時重新建構回原始的資料結構。本文將介紹兩個好用的Python套件-JSON與Pickle,並比較兩者的不同。
Thumbnail
Hi,大家好。我是茶桁。 上一节课,我们详细的介绍了文件读写的流程和原理,并用Python进行实际操作了一下。 那么这节课呢,我们利用之前所学的内容,尝试做一个小练习:建立一个登录注册系统。上节课我们在结尾的时候讲练习内容贴了出来,还记得要求吗?  实现功能:  1. 用户输入用户名和密码以及
Thumbnail
Hi,大家好。我是茶桁。 上一节课,我们详细的介绍了文件读写的流程和原理,并用Python进行实际操作了一下。 那么这节课呢,我们利用之前所学的内容,尝试做一个小练习:建立一个登录注册系统。上节课我们在结尾的时候讲练习内容贴了出来,还记得要求吗?  实现功能:  1. 用户输入用户名和密码以及
Thumbnail
在本篇Python學習筆記中,我們探討了字典的建立與存取,以及常用方法,字典是一種強大的資料型態,透過key和value的對應關係存儲和取得資料,我們學會了建立字典、存取資料、新增/修改/刪除項目,以及取得key和value的方法,字典是Python中不可或缺的工具!
Thumbnail
在本篇Python學習筆記中,我們探討了字典的建立與存取,以及常用方法,字典是一種強大的資料型態,透過key和value的對應關係存儲和取得資料,我們學會了建立字典、存取資料、新增/修改/刪除項目,以及取得key和value的方法,字典是Python中不可或缺的工具!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News