背景介绍
在学习和工作中,我们经常需要记录和复习各种知识点、单词、概念等信息。传统的学习方式依赖于纸质笔记或电子文档,但缺乏系统化的管理和快速检索能力。为了提升学习效率,我们可以借助命令行工具开发一个“个人知识卡片”管理工具,类似于 Anki 的卡片系统,但以命令行方式运行,便于快速操作和本地存储。
本项目旨在实现一个轻量级的命令行工具,用于创建、查看、编辑、删除和标记知识卡片的状态(如“未完成”或“已完成”)。该工具使用 Python 编写,仅依赖标准库,无需额外安装,适合中级以下开发者快速上手。
思路分析
功能需求
- 添加卡片:用户可以通过命令行参数输入卡片的标题和内容。
- 查看卡片:列出所有卡片,或根据状态(完成/未完成)过滤。
- 标记卡片为完成:通过卡片编号标记其状态。
- 删除卡片:通过编号删除指定卡片。
- 数据持久化:将卡片信息保存到本地文件中,确保数据不丢失。
技术实现
- 文件读写:使用 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、添加标签系统等。希望这个工具能帮助你更高效地管理学习内容!