开发一个命令行版的“个人知识卡片”管理工具



背景介绍

在学习和工作中,我们经常需要记录和复习各种知识点、单词、概念等信息。传统的学习方式依赖于纸质笔记或电子文档,但缺乏系统化的管理和快速检索能力。为了提升学习效率,我们可以借助命令行工具开发一个“个人知识卡片”管理工具,类似于 Anki 的卡片系统,但以命令行方式运行,便于快速操作和本地存储。

本项目旨在实现一个轻量级的命令行工具,用于创建、查看、编辑、删除和标记知识卡片的状态(如“未完成”或“已完成”)。该工具使用 Python 编写,仅依赖标准库,无需额外安装,适合中级以下开发者快速上手。


思路分析

功能需求

  1. 添加卡片:用户可以通过命令行参数输入卡片的标题和内容。
  2. 查看卡片:列出所有卡片,或根据状态(完成/未完成)过滤。
  3. 标记卡片为完成:通过卡片编号标记其状态。
  4. 删除卡片:通过编号删除指定卡片。
  5. 数据持久化:将卡片信息保存到本地文件中,确保数据不丢失。

技术实现

  • 文件读写:使用 Python 的 json 模块保存和加载卡片数据。
  • 命令行参数解析:使用 argparse 模块处理命令行输入。
  • 数据结构:使用字典和列表存储卡片信息。
  • 状态管理:为每张卡片添加一个“完成”状态字段。

文件结构

卡片数据将保存为一个 JSON 文件(如 cards.json),格式如下:

[
  {
    "id": 1,
    "title": "Python列表推导式",
    "content": "一种简洁的创建列表的方式,语法为 [expression for item in iterable]",
    "completed": false
  }
]

代码实现

以下是完整的 Python 实现代码,包含注释和说明:

import argparse
import json
import os

# 定义卡片数据存储文件路径
CARD_FILE = "cards.json"

# 初始化卡片文件(如果不存在)
def init_card_file():
    if not os.path.exists(CARD_FILE):
        with open(CARD_FILE, "w", encoding="utf-8") as f:
            json.dump([], f)

# 从文件中加载卡片数据
def load_cards():
    with open(CARD_FILE, "r", encoding="utf-8") as f:
        return json.load(f)

# 将卡片数据写入文件
def save_cards(cards):
    with open(CARD_FILE, "w", encoding="utf-8") as f:
        json.dump(cards, f, ensure_ascii=False, indent=2)

# 添加一张新卡片
def add_card(title, content):
    cards = load_cards()
    new_card = {
        "id": len(cards) + 1,
        "title": title,
        "content": content,
        "completed": False
    }
    cards.append(new_card)
    save_cards(cards)
    print(f"卡片已添加:{title}")

# 查看所有卡片
def list_cards(completed=False):
    cards = load_cards()
    filtered = [card for card in cards if card["completed"] == completed]
    if not filtered:
        print("没有卡片。")
        return
    for card in filtered:
        status = "[已完成]" if card["completed"] else "[未完成]"
        print(f"{card['id']}. {status} {card['title']}: {card['content']}")

# 标记卡片为完成
def mark_card(card_id):
    cards = load_cards()
    for card in cards:
        if card["id"] == card_id:
            card["completed"] = True
            save_cards(cards)
            print(f"卡片 {card_id} 已标记为完成。")
            return
    print(f"未找到编号为 {card_id} 的卡片。")

# 删除卡片
def delete_card(card_id):
    cards = load_cards()
    new_cards = [card for card in cards if card["id"] != card_id]
    if len(new_cards) == len(cards):
        print(f"未找到编号为 {card_id} 的卡片。")
    else:
        save_cards(new_cards)
        print(f"卡片 {card_id} 已删除。")

# 主函数
def main():
    init_card_file()
    parser = argparse.ArgumentParser(description="个人知识卡片管理工具")
    subparsers = parser.add_subparsers(dest="command")

    # add 子命令
    add_parser = subparsers.add_parser("add", help="添加新卡片")
    add_parser.add_argument("title", type=str, help="卡片标题")
    add_parser.add_argument("content", type=str, help="卡片内容")
    add_parser.set_defaults(func=add_card)

    # list 子命令
    list_parser = subparsers.add_parser("list", help="列出所有卡片")
    list_parser.add_argument("--completed", action="store_true", help="仅显示已完成的卡片")
    list_parser.set_defaults(func=list_cards)

    # mark 子命令
    mark_parser = subparsers.add_parser("mark", help="标记卡片为完成")
    mark_parser.add_argument("card_id", type=int, help="卡片编号")
    mark_parser.set_defaults(func=mark_card)

    # delete 子命令
    delete_parser = subparsers.add_parser("delete", help="删除卡片")
    delete_parser.add_argument("card_id", type=int, help="卡片编号")
    delete_parser.set_defaults(func=delete_card)

    args = parser.parse_args()
    if hasattr(args, "func"):
        args.func(args)
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

使用示例

添加卡片

$ python card_manager.py add "Python列表推导式" "一种简洁的创建列表的方式,语法为 [expression for item in iterable]"

查看所有卡片

$ python card_manager.py list
1. [未完成] Python列表推导式: 一种简洁的创建列表的方式,语法为 [expression for item in iterable]

标记卡片为完成

$ python card_manager.py mark 1

查看已完成的卡片

$ python card_manager.py list --completed
1. [已完成] Python列表推导式: 一种简洁的创建列表的方式,语法为 [expression for item in iterable]

删除卡片

$ python card_manager.py delete 1

总结

本项目实现了一个命令行版的“个人知识卡片”管理工具,功能包括添加、查看、标记完成、删除卡片,并将数据持久化存储在本地 JSON 文件中。该项目结构清晰,代码简洁,适合中级以下开发者学习和实践,涵盖了文件读写、命令行参数解析、数据结构操作等核心技术点。

通过这个项目,你可以进一步扩展功能,如支持搜索卡片、导出为 Markdown 或 PDF、添加标签系统等。希望这个工具能帮助你更高效地管理学习内容!


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注