一、前言
在前幾天的學習中,我已經完成健康紀錄的資料結構設計,並學習使用 Python、List、Dictionary、Pandas、CSV 與 SQLite 儲存及讀取資料。
不過,當使用者開始輸入資料時,並不是每一次輸入都會符合系統的需求。例如,使用者可能忘記填寫喝水量、將睡眠時間輸入成文字,或是不小心輸入負數。如果系統沒有檢查這些資料,就可能導致程式發生錯誤,或讓後續統計結果失去參考價值。
因此,今天的學習重點是資料驗證(Data Validation),讓系統在儲存健康紀錄之前,先確認使用者輸入的內容是否完整、格式是否正確,以及數值是否合理。
二、為什麼需要資料驗證?
資料驗證的目的,是避免錯誤或不完整的資料進入系統。以個人健康習慣追蹤系統為例,常見的輸入問題包括以下幾種。

透過這些檢查,系統可以在資料儲存前先攔截常見錯誤,降低後續資料分析與統計發生問題的機率。
需要注意的是,數值範圍只是程式用來辨識明顯錯誤的基本檢查條件,不代表醫療上的標準,也不能單憑這些數值判斷個人的健康狀況。
三、使用 Python 檢查空白欄位
首先,可以使用 input() 接收使用者輸入的資料,再透過 strip() 去除文字前後的空白。
如果使用者只輸入空格,程式也會將它視為空白資料。
water_input = input("請輸入今日喝水量(毫升):").strip()
if water_input == "":
print("輸入錯誤:喝水量不可空白。")
else:
print("輸入成功:", water_input)
這段程式會先檢查使用者是否有輸入內容。如果欄位是空的,就顯示錯誤訊息;如果有輸入內容,才繼續處理。
四、檢查輸入格式與數值範圍
即使使用者有輸入內容,也不代表輸入的一定是數字。例如,喝水量可能被輸入成「很多」或「500ml」。
這時可以使用 try...except 處理數字轉換時可能發生的錯誤,再透過 if 判斷數值是否落在設定的合理範圍內。
water_input = input("請輸入今日喝水量(毫升):").strip()
if water_input == "":
print("輸入錯誤:喝水量不可空白。")
else:
try:
water = int(water_input)
if water < 0:
print("輸入錯誤:喝水量不可為負數。")
elif water > 10000:
print("請確認輸入的喝水量是否正確。")
else:
print("喝水量紀錄成功:", water, "毫升")
except ValueError:
print("輸入錯誤:請輸入整數。")
這段程式包含三個重要概念:
int():將輸入內容轉換成整數。
try...except:當輸入內容無法轉換成整數時,避免程式直接中斷。
if...elif...else:根據數值的不同情況,決定要顯示錯誤訊息或接受資料。
範例中的 10,000 毫升是用來示範程式如何檢查過高的數值,實際使用時應依照專案需求調整,並允許使用者確認或修正輸入。
五、建立可重複使用的驗證函式
如果每一個健康欄位都重複撰寫相似的檢查程式,程式碼會變得冗長。因此,可以將驗證邏輯整理成函式,方便後續重複使用。
以下以睡眠時間為例,檢查使用者是否輸入數字,以及數值是否介於 0 到 24 小時之間。
def validate_sleep(value):
value = value.strip()
if value == "":
return False, "睡眠時間不可空白。"
try:
sleep = float(value)
except ValueError:
return False, "睡眠時間必須是數字。"
if sleep < 0 or sleep > 24:
return False, "睡眠時間必須介於 0 到 24 小時。"
return True, sleep
sleep_input = input("請輸入今日睡眠時間(小時):")
is_valid, result = validate_sleep(sleep_input)
if is_valid:
print("睡眠紀錄成功:", result, "小時")
else:
print("輸入錯誤:", result)
這個函式會回傳兩個值:
True 或 False:代表資料是否通過驗證。
驗證結果或錯誤訊息:讓主程式知道接下來要如何處理。
使用函式的好處是,未來新增喝水量、運動時間等欄位時,可以用相同的概念設計不同的驗證規則,讓程式更容易維護。
六、檢查日期格式
健康紀錄通常需要記錄日期,因此日期格式也必須保持一致。若日期輸入錯誤,可能會影響歷史紀錄查詢與每週統計。
Python 可以使用 datetime 模組檢查日期是否符合指定格式。
from datetime import datetime
date_input = input("請輸入日期(YYYY-MM-DD):").strip()
try:
record_date = datetime.strptime(date_input, "%Y-%m-%d")
print("日期格式正確:", record_date.date())
except ValueError:
print("輸入錯誤:請使用 YYYY-MM-DD 格式,並確認日期有效。")
例如,2026-10-23 是有效日期,但 2026-13-45 並不是有效日期,因此會觸發錯誤處理。
透過日期驗證,可以讓系統中的健康紀錄使用統一格式,降低後續排序、查詢與分析的困難。
七、今日實作步驟
今天的實作以建立基本的資料驗證能力為主,暫時不需要整合網頁介面。
建立一個 Python 程式,讓使用者輸入喝水量。
檢查輸入內容是否為空白。
使用 try...except 檢查輸入是否能轉換成數字。
拒絕負數,並針對過高的數值顯示確認訊息。
讓使用者輸入睡眠時間,並檢查數值是否介於 0 到 24 小時之間。
測試不同輸入情況,確認程式能正確顯示結果。
可以使用以下資料進行測試:

完成測試後,觀察程式是否能在遇到錯誤輸入時持續正常執行,而不是直接中斷。
八、今日成果與學習心得
透過今天的學習,我了解資料驗證是健康習慣追蹤系統的重要環節。除了將資料輸入程式與保存資料之外,還需要確認資料是否完整、格式是否正確,以及數值是否符合系統設定的基本條件。
今天學習了 strip()、try...except、if...elif...else、函式與日期格式檢查等概念,也練習將驗證邏輯整理成可以重複使用的函式。
這些功能能讓系統更穩定,並為後續的資料儲存、歷史紀錄查詢及健康數據分析建立更可靠的基礎。
九、下一步學習方向
第二階段到今天正式完成。接下來將進入第三階段「建立系統基本功能」。
Day 13 將學習 Streamlit 入門:建立第一個互動式網頁,把目前以終端機輸入資料的方式,逐步轉換成具有標題、文字輸入欄位與互動元件的網頁介面,讓個人健康習慣追蹤系統開始具備實際操作的雛形。