折腾侠
项目实战

从零打造个人任务管理系统:Python 命令行实践

折腾侠
2026/04/25 发布
0约 8 分钟1354 字 / 883 词00

从零打造个人任务管理系统:Python 命令行实践

引言

在日常工作和学习中,我们常常需要管理各种任务:待办事项、项目进度、截止日期提醒等等。虽然市面上有众多任务管理工具,但很多时候我们只需要一个轻量级、可定制、完全掌控的解决方案。本文将带你从零开始,使用 Python 构建一个功能完整的命令行任务管理系统。

这个项目不仅能够帮助你管理日常任务,更是一个学习 Python 编程、文件操作、数据结构的绝佳实践。通过完成这个项目,你将掌握如何设计 CLI 应用、如何持久化存储数据、如何处理用户输入等核心技能。

项目功能说明

本任务管理系统包含以下核心功能:

1. 任务创建

  • 支持添加任务标题和详细描述
  • 自动分配唯一任务 ID
  • 记录创建时间
  • 支持设置优先级(高/中/低)
  • 支持添加标签分类

2. 任务查看

  • 列出所有任务
  • 按状态筛选(待办/进行中/已完成)
  • 按优先级筛选
  • 按标签筛选
  • 搜索任务关键词

3. 任务更新

  • 修改任务标题和描述
  • 更改任务状态
  • 调整优先级
  • 添加或移除标签

4. 任务删除

  • 删除单个任务
  • 批量删除已完成任务
  • 支持确认机制防止误删

5. 数据统计

  • 显示任务总数
  • 按状态统计数量
  • 显示完成率

技术栈选择

核心语言:Python 3.8+

选择 Python 是因为其简洁的语法、丰富的标准库以及出色的跨平台兼容性。Python 的 INLINE_CODE_0 模块可以方便地构建命令行接口,INLINE_CODE_1 模块提供了便捷的数据持久化方案。

数据存储:JSON 文件

使用 JSON 格式存储任务数据,原因如下:

  • 人类可读,便于调试和手动编辑
  • 跨平台兼容,无需数据库依赖
  • Python 原生支持,无需额外安装库
  • 适合小规模数据存储(几百到几千条任务)

命令行框架:argparse

Python 标准库中的 INLINE_CODE_2 模块提供了强大的命令行参数解析能力,支持子命令、位置参数、可选参数等功能,完全满足本项目需求。

时间处理:datetime

使用 Python 内置的 INLINE_CODE_3 模块处理时间戳,支持任务的创建时间记录、完成时间追踪以及过期提醒功能。

核心代码结构

项目目录结构

task_manager/
├── task_manager.py      # 主程序入口
├── storage.py           # 数据存储模块
├── models.py            # 数据模型定义
├── commands.py          # 命令处理逻辑
├── tasks.json           # 任务数据存储文件
└── README.md            # 项目说明文档

数据模型设计(models.py)

Python
from dataclasses import dataclass, asdict
from datetime import datetime
from typing import Optional, List
import uuid

@dataclass
class Task:
    id: str
    title: str
    description: str
    status: str  # pending, in_progress, completed
    priority: str  # high, medium, low
    tags: List[str]
    created_at: str
    completed_at: Optional[str] = None
    
    @classmethod
    def create(cls, title: str, description: str, 
               priority: str = "medium", tags: List[str] = None) -> "Task":
        return cls(
            id=str(uuid.uuid4())[:8],
            title=title,
            description=description,
            status="pending",
            priority=priority,
            tags=tags or [],
            created_at=datetime.now().isoformat()
        )
    
    def to_dict(self) -> dict:
        return asdict(self)
    
    @classmethod
    def from_dict(cls, data: dict) -> "Task":
        return cls(**data)

数据存储模块(storage.py)

Python
import json
from pathlib import Path
from typing import List, Optional
from models import Task

class TaskStorage:
    def __init__(self, db_path: str = "tasks.json"):
        self.db_path = Path(db_path)
        self._ensure_db_exists()
    
    def _ensure_db_exists(self):
        if not self.db_path.exists():
            self.db_path.write_text("[]")
    
    def load_all(self) -> List[Task]:
        data = json.loads(self.db_path.read_text())
        return [Task.from_dict(item) for item in data]
    
    def save_all(self, tasks: List[Task]):
        data = [task.to_dict() for task in tasks]
        self.db_path.write_text(json.dumps(data, indent=2, ensure_ascii=False))
    
    def add(self, task: Task):
        tasks = self.load_all()
        tasks.append(task)
        self.save_all(tasks)
    
    def get_by_id(self, task_id: str) -> Optional[Task]:
        tasks = self.load_all()
        for task in tasks:
            if task.id == task_id:
                return task
        return None
    
    def update(self, task: Task):
        tasks = self.load_all()
        for i, t in enumerate(tasks):
            if t.id == task.id:
                tasks[i] = task
                break
        self.save_all(tasks)
    
    def delete(self, task_id: str):
        tasks = self.load_all()
        tasks = [t for t in tasks if t.id != task_id]
        self.save_all(tasks)

命令处理模块(commands.py)

Python
from typing import List
from storage import TaskStorage
from models import Task

class CommandHandler:
    def __init__(self):
        self.storage = TaskStorage()
    
    def add_task(self, title: str, description: str, 
                 priority: str, tags: List[str]):
        task = Task.create(title, description, priority, tags)
        self.storage.add(task)
        print(f"✓ 任务已创建 (ID: {task.id})")
    
    def list_tasks(self, status: str = None, priority: str = None, 
                   tags: List[str] = None):
        tasks = self.storage.load_all()
        
        # 筛选逻辑
        if status:
            tasks = [t for t in tasks if t.status == status]
        if priority:
            tasks = [t for t in tasks if t.priority == priority]
        if tags:
            tasks = [t for t in tasks if any(tag in t.tags for tag in tags)]
        
        # 显示结果
        if not tasks:
            print("暂无任务")
            return
        
        for task in tasks:
            status_icon = {"pending": "⏳", "in_progress": "🔄", "completed": "✅"}
            priority_icon = {"high": "🔴", "medium": "🟡", "low": "🟢"}
            print(f"{status_icon[task.status]} [{task.id}] {task.title}")
            print(f"   优先级:{priority_icon[task.priority]} {task.priority}")
            print(f"   标签:{', '.join(task.tags) if task.tags else '无'}")
            print(f"   创建:{task.created_at[:10]}")
            print()
    
    def complete_task(self, task_id: str):
        task = self.storage.get_by_id(task_id)
        if not task:
            print(f"✗ 未找到任务 {task_id}")
            return
        task.status = "completed"
        task.completed_at = datetime.now().isoformat()
        self.storage.update(task)
        print(f"✓ 任务 {task_id} 已完成")
    
    def delete_task(self, task_id: str):
        self.storage.delete(task_id)
        print(f"✓ 任务 {task_id} 已删除")
    
    def stats(self):
        tasks = self.storage.load_all()
        total = len(tasks)
        completed = len([t for t in tasks if t.status == "completed"])
        pending = len([t for t in tasks if t.status == "pending"])
        in_progress = len([t for t in tasks if t.status == "in_progress"])
        
        print("📊 任务统计")
        print(f"   总计:{total}")
        print(f"   待办:{pending}")
        print(f"   进行中:{in_progress}")
        print(f"   已完成:{completed}")
        if total > 0:
            rate = completed / total * 100
            print(f"   完成率:{rate:.1f}%")

主程序入口(task_manager.py)

Python
import argparse
from commands import CommandHandler

def main():
    parser = argparse.ArgumentParser(description="个人任务管理系统")
    subparsers = parser.add_subparsers(dest="command", help="可用命令")
    
    # add 命令
    add_parser = subparsers.add_parser("add", help="添加新任务")
    add_parser.add_argument("title", help="任务标题")
    add_parser.add_argument("-d", "--description", default="", help="任务描述")
    add_parser.add_argument("-p", "--priority", choices=["high", "medium", "low"], 
                           default="medium", help="优先级")
    add_parser.add_argument("-t", "--tags", nargs="*", default=[], help="标签列表")
    
    # list 命令
    list_parser = subparsers.add_parser("list", help="列出任务")
    list_parser.add_argument("-s", "--status", choices=["pending", "in_progress", "completed"])
    list_parser.add_argument("-p", "--priority", choices=["high", "medium", "low"])
    list_parser.add_argument("-t", "--tags", nargs="*", help="按标签筛选")
    
    # complete 命令
    complete_parser = subparsers.add_parser("complete", help="完成任务")
    complete_parser.add_argument("task_id", help="任务 ID")
    
    # delete 命令
    delete_parser = subparsers.add_parser("delete", help="删除任务")
    delete_parser.add_argument("task_id", help="任务 ID")
    
    # stats 命令
    subparsers.add_parser("stats", help="显示统计信息")
    
    args = parser.parse_args()
    handler = CommandHandler()
    
    if args.command == "add":
        handler.add_task(args.title, args.description, args.priority, args.tags)
    elif args.command == "list":
        handler.list_tasks(args.status, args.priority, args.tags)
    elif args.command == "complete":
        handler.complete_task(args.task_id)
    elif args.command == "delete":
        handler.delete_task(args.task_id)
    elif args.command == "stats":
        handler.stats()
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

运行步骤

第一步:环境准备

确保已安装 Python 3.8 或更高版本:

Bash
python --version

第二步:创建项目目录

Bash
mkdir task_manager
cd task_manager

第三步:创建源代码文件

将上述代码分别保存为对应的 INLINE_CODE_4 文件:

  • INLINE_CODE_5 - 数据模型
  • INLINE_CODE_6 - 存储模块
  • INLINE_CODE_7 - 命令处理
  • INLINE_CODE_8 - 主程序

第四步:运行测试

Bash
# 添加任务
python task_manager.py add "完成项目文档" -d "撰写 README 和使用说明" -p high -t 文档 工作

# 查看任务列表
python task_manager.py list

# 按状态筛选
python task_manager.py list -s pending

# 完成任务
python task_manager.py complete <任务 ID>

# 查看统计
python task_manager.py stats

第五步:添加命令行别名(可选)

为了方便使用,可以添加 shell 别名:

Bash
# ~/.bashrc 或 ~/.zshrc
alias tm='python /path/to/task_manager/task_manager.py'

总结与扩展建议

通过本项目,我们成功构建了一个功能完整的命令行任务管理系统。这个系统虽然简洁,但具备了任务管理的核心功能:创建、查看、更新、删除和统计。

项目亮点

  1. 零依赖:仅使用 Python 标准库,无需安装第三方包
  2. 数据持久化:JSON 存储确保任务数据不会丢失
  3. 灵活筛选:支持按状态、优先级、标签多维度筛选
  4. 扩展友好:模块化设计便于后续功能扩展

可扩展方向

  1. 添加过期提醒:增加截止日期字段,支持过期任务提醒
  2. 数据导出:支持导出为 CSV、Markdown 等格式
  3. 任务依赖:支持设置任务之间的依赖关系
  4. 时间追踪:记录任务实际耗时,生成时间报告
  5. GUI 界面:使用 tkinter 或 PyQt 添加图形界面
  6. 云同步:集成 WebDAV 或云存储实现多设备同步

学习收获

通过这个项目,你掌握了:

  • Python 命令行应用开发流程
  • 数据模型设计与实现
  • 文件存储与数据持久化
  • 模块化代码组织方式
  • 命令行参数解析技巧

这个项目可以作为你 Python 学习之路的里程碑,也可以作为日常使用的实用工具。更重要的是,它展示了如何将一个想法转化为实际可用的软件产品。现在,开始动手构建属于你自己的任务管理系统吧!

分享到:

如果这篇文章对你有帮助,欢迎请作者喝杯咖啡 ☕

加载评论中...