今天要做什麼
昨天我先分享了為什麼要用Python寫30天的小實作。
今天,我們要動手完成第一個實用工具:
命令列待辦清單(CLI To-Do List)
這個小工具可以讓我們直接在電腦終端機裡:
新增待辦事項
查看所有待辦事項
標記完成的任務
用到的工具
argparse:處理命令列參數
json:存取本地 JSON 檔案,當作小型資料庫
datetime:記錄新增任務的時間
程式碼實作
建立一個檔案:todo.py
import argparse, json, os, datetime as dt
DB = "todo.json"
def load_db():
if not os.path.exists(DB):
return []
with open(DB, "r", encoding="utf-8") as f:
return json.load(f)
def save_db(rows):
with open(DB, "w", encoding="utf-8") as f:
json.dump(rows, f, ensure_ascii=False, indent=2)
def add_task(text):
rows = load_db()
rows.append({
"id": len(rows) + 1,
"text": text,
"done": False,
"ts": dt.datetime.now().isoformat()
})
save_db(rows)
print("✅ 已加入:", text)
def list_tasks():
rows = load_db()
if not rows:
print("目前沒有待辦事項")
return
for r in rows:
flag = "✔" if r["done"] else "•"
print(f'{flag} [{r["id"]}] {r["text"]}')
def done_task(i):
rows = load_db()
for r in rows:
if r["id"] == i:
r["done"] = True
save_db(rows)
print(f"✅ 完成編號 {i}")
if __name__ == "__main__":
p = argparse.ArgumentParser(description="簡易待辦清單 CLI")
sub = p.add_subparsers(dest="cmd", required=True)
pa = sub.add_parser("add"); pa.add_argument("text")
sub.add_parser("list")
pd = sub.add_parser("done"); pd.add_argument("id", type=int)
a = p.parse_args()
if a.cmd == "add":
add_task(a.text)
elif a.cmd == "list":
list_tasks()
elif a.cmd == "done":
done_task(a.id)
執行範例
新增待辦python todo.py add "買牛奶" python todo.py add "寫鐵人賽文章"
查看清單
python todo.py list
輸出:
[1] 買牛奶
[2] 寫鐵人賽文章
完成一項
python todo.py done 1
輸出:
完成編號 1
再查看清單:
[1] 買牛奶
[2] 寫鐵人賽文章
實作:
今日心得
JSON 檔就能當作小型資料庫,非常輕便。
argparse 讓 CLI 工具寫起來結構清楚。
這個小工具雖然簡單,但已經能實際應用在生活裡了。
明天我們會做一個 自動整理檔案的工具,能把資料夾裡的檔案依日期或副檔名分類存好。
哇這個 CLI To-Do List 超實用!
我平常也是用 JSON 當小型資料庫,真的輕便到不行,還不用另外架 DB。
看到你用 argparse 管理參數,我才想到之前寫自動整理檔案的小腳本,光是 sys.argv 就讓我 debug 半天 😂 argparse 果然優雅很多。
期待你明天的自動整理檔案工具!這功能我真的需要,因為我的 Download 資料夾已經亂到爆炸了 🙈