构建命令行单词记忆工具:JSON 词库与艾宾浩斯复习算法的完美结合

本文将手把手教你打造一款轻量、高效的Python 命令行单词记忆工具 ,核心结合JSON 格式词库 (易读写、可扩展)和艾宾浩斯遗忘曲线复习算法(科学记忆、抗遗忘),无需复杂框架,仅用 Python 内置库 + 少量第三方依赖,跨平台支持 Windows/Mac/Linux,适合日常背单词、定制专属词库。

工具核心设计

1. 核心功能

  • 词库管理:初始化 JSON 词库、添加单词、查看词库、按状态筛选(新学 / 待复习 / 已掌握)
  • 科学复习:基于艾宾浩斯遗忘曲线,自动计算单词下次复习时间,按记忆状态推送复习内容
  • 命令行交互:简洁的终端操作、彩色提示、输入校验,无需图形界面,轻量化运行
  • 数据持久化:所有单词和记忆状态实时保存到 JSON 文件,关闭工具不丢失数据

2. 技术选型

  • 开发语言:Python3.6+(语法简洁、内置 JSON 处理、跨平台)
  • 词库格式:JSON(易手动编辑、程序读写高效,可直接用记事本 / 编辑器修改)
  • 复习算法:艾宾浩斯遗忘曲线(核心是按复习次数动态调整复习间隔
  • 终端交互:argparse(命令行参数解析)、colorama(终端彩色输出,提升体验)
  • 内置依赖:json(词库读写)、datetime(时间计算)、os(文件路径处理)、random(随机抽题)

3. 艾宾浩斯复习算法落地规则

结合单词记忆特点,简化并落地经典艾宾浩斯曲线,核心是根据复习次数设置不同的复习间隔,未掌握则重置间隔,掌握则逐步延长,最终达到长期记忆:

  1. 新学单词(复习次数 = 0):首次复习间隔1 天
  2. 第 1 次复习通过:下次复习间隔2 天(累计 3 天)
  3. 第 2 次复习通过:下次复习间隔4 天(累计 7 天)
  4. 第 3 次复习通过:下次复习间隔7 天(累计 14 天)
  5. 第 4 次复习通过:下次复习间隔15 天(累计 29 天)
  6. 第 5 次复习通过:标记为已掌握,不再参与常规复习
  7. 任意一次复习未通过:重置复习次数为 0,间隔恢复为 1 天,重新进入记忆周期

4. JSON 词库结构设计

词库文件命名为vocab_lib.json,采用数组 + 对象 结构,每个单词包含核心记忆字段算法支撑字段,字段设计兼顾易用性和算法需求,可直接手动编辑添加单词:

json

复制代码
[
  {
    "english": "abandon",
    "chinese": "v. 放弃,抛弃;n. 放任,放纵",
    "status": "pending",  // 状态:new(新学)/pending(待复习)/mastered(已掌握)
    "review_count": 0,   // 复习次数
    "next_review": "2026-02-03 10:00:00"  // 下次复习时间(时间戳格式化,便于程序判断)
  }
]

完整实现代码

步骤 1:环境准备

先安装唯一第三方依赖(终端彩色输出):

bash

复制代码
pip install colorama

步骤 2:完整代码(单文件,直接运行)

创建文件vocab_memory.py,复制以下代码,支持命令行子命令init/add/show/review),操作简洁直观:

python

复制代码
import json
import argparse
import random
import os
from datetime import datetime, timedelta
from colorama import init, Fore, Back, Style

# 初始化colorama,支持跨平台彩色输出
init(autoreset=True)
# 词库文件路径(当前目录下的vocab_lib.json)
VOCAB_FILE = "vocab_lib.json"
# 艾宾浩斯复习间隔(单位:天),索引对应复习次数(0-4次)
REVIEW_INTERVALS = [1, 2, 4, 7, 15]

def init_vocab_lib():
    """初始化JSON词库文件,若已存在则提示"""
    if os.path.exists(VOCAB_FILE):
        print(Fore.YELLOW + f"词库文件{VOCAB_FILE}已存在,无需重复初始化!")
        return
    # 初始空词库
    init_data = []
    with open(VOCAB_FILE, "w", encoding="utf-8") as f:
        json.dump(init_data, f, ensure_ascii=False, indent=2)
    print(Fore.GREEN + f"词库初始化成功!已创建文件:{VOCAB_FILE}")

def load_vocab_lib():
    """加载词库文件,返回单词列表;若文件不存在则自动初始化"""
    if not os.path.exists(VOCAB_FILE):
        init_vocab_lib()
    with open(VOCAB_FILE, "r", encoding="utf-8") as f:
        try:
            vocab_list = json.load(f)
        except json.JSONDecodeError:
            print(Fore.RED + "词库文件损坏,已重置为空词库!")
            vocab_list = []
    return vocab_list

def save_vocab_lib(vocab_list):
    """保存单词列表到JSON词库,实时持久化数据"""
    with open(VOCAB_FILE, "w", encoding="utf-8") as f:
        json.dump(vocab_list, f, ensure_ascii=False, indent=2)

def add_vocab(english, chinese):
    """添加单词到词库,自动去重,初始化记忆状态"""
    if not english or not chinese:
        print(Fore.RED + "错误:英文和中文释义不能为空!")
        return
    # 统一英文小写,避免重复(如Abandon和abandon视为同一个)
    english = english.strip().lower()
    chinese = chinese.strip()
    
    vocab_list = load_vocab_lib()
    # 检查是否已存在
    for vocab in vocab_list:
        if vocab["english"] == english:
            print(Fore.YELLOW + f"单词【{english}】已存在于词库,无需重复添加!")
            return
    # 初始化新单词状态:新学、复习次数0、下次复习时间=当前+1天
    now = datetime.now()
    next_review = (now + timedelta(days=REVIEW_INTERVALS[0])).strftime("%Y-%m-%d %H:%M:%S")
    new_vocab = {
        "english": english,
        "chinese": chinese,
        "status": "new",
        "review_count": 0,
        "next_review": next_review
    }
    vocab_list.append(new_vocab)
    save_vocab_lib(vocab_list)
    print(Fore.GREEN + f"单词添加成功!【{english}】- {chinese}")

def show_vocabs(status=None):
    """查看词库,支持按状态筛选:new/pending/mastered,默认显示全部"""
    vocab_list = load_vocab_lib()
    if not vocab_list:
        print(Fore.BLUE + "词库为空,先添加单词吧!")
        return
    # 筛选单词
    if status:
        status = status.lower()
        filtered_list = [v for v in vocab_list if v["status"] == status]
        if not filtered_list:
            print(Fore.BLUE + f"词库中无{status}状态的单词!")
            return
    else:
        filtered_list = vocab_list
    # 格式化输出
    print(Fore.CYAN + f"===== 词库列表(共{len(filtered_list)}个)=====")
    status_map = {"new": Fore.YELLOW + "新学", "pending": Fore.RED + "待复习", "mastered": Fore.GREEN + "已掌握"}
    for idx, vocab in enumerate(filtered_list, 1):
        status_show = status_map.get(vocab["status"], vocab["status"])
        print(f"{idx:2d}. {Fore.WHITE + vocab['english']:<15} {vocab['chinese']:<30} 状态:{status_show}  复习次数:{vocab['review_count']}")

def calculate_next_review(review_count):
    """根据复习次数计算下次复习时间,返回格式化字符串"""
    now = datetime.now()
    # 取对应间隔,超过4次则返回None(标记为已掌握)
    if review_count < len(REVIEW_INTERVALS):
        delta_days = REVIEW_INTERVALS[review_count]
        next_time = now + timedelta(days=delta_days)
        return next_time.strftime("%Y-%m-%d %H:%M:%S")
    return None

def review_vocabs():
    """核心复习功能:筛选待复习单词,随机提问,根据掌握情况更新状态"""
    vocab_list = load_vocab_lib()
    if not vocab_list:
        print(Fore.BLUE + "词库为空,先添加单词再开始复习吧!")
        return
    now = datetime.now()
    # 筛选待复习单词:new(新学) 或 pending(待复习)且下次复习时间<=当前时间
    to_review_list = []
    for vocab in vocab_list:
        if vocab["status"] == "new":
            to_review_list.append(vocab)
        elif vocab["status"] == "pending":
            next_review_time = datetime.strptime(vocab["next_review"], "%Y-%m-%d %H:%M:%S")
            if next_review_time <= now:
                to_review_list.append(vocab)
    
    if not to_review_list:
        print(Fore.GREEN + "恭喜!暂无待复习单词,今天的记忆任务完成啦!")
        return
    # 随机打乱,避免固定顺序记忆
    random.shuffle(to_review_list)
    print(Fore.CYAN + f"===== 开始复习(共{len(to_review_list)}个单词)=====")
    print(Fore.WHITE + "提示:输入【y】表示掌握,【n】表示未掌握,【q】退出复习\n")

    # 遍历复习
    for vocab in to_review_list:
        eng = vocab["english"]
        chn = vocab["chinese"]
        # 提问:先显示英文,让用户回忆释义
        print(Fore.MAGENTA + f"单词:{eng}")
        # 等待用户输入
        while True:
            user_input = input(Fore.WHITE + "是否掌握?(y/n/q):").strip().lower()
            if user_input in ["y", "n", "q"]:
                break
            print(Fore.RED + "输入错误!请输入y/n/q")
        
        if user_input == "q":
            print(Fore.BLUE + "已退出复习,未完成的单词将保留到下次!")
            save_vocab_lib(vocab_list)
            return
        # 显示释义
        print(Fore.CYAN + f"释义:{chn}\n")

        # 根据掌握情况更新单词状态
        if user_input == "y":
            # 掌握:复习次数+1,计算下次复习时间
            vocab["review_count"] += 1
            next_review = calculate_next_review(vocab["review_count"])
            if next_review:
                vocab["status"] = "pending"
                vocab["next_review"] = next_review
                print(Fore.GREEN + f"掌握成功!下次复习时间:{vocab['next_review']}\n")
            else:
                # 复习次数≥5次,标记为已掌握
                vocab["status"] = "mastered"
                vocab["next_review"] = ""
                print(Fore.GREEN + f"恭喜!【{eng}】已掌握,纳入长期记忆!\n")
        else:
            # 未掌握:重置复习次数为0,下次复习时间=当前+1天
            vocab["review_count"] = 0
            vocab["next_review"] = calculate_next_review(0)
            vocab["status"] = "pending"
            print(Fore.RED + f"未掌握,已重置复习计划!下次复习时间:{vocab['next_review']}\n")
    
    # 复习完成,保存数据
    save_vocab_lib(vocab_list)
    print(Fore.GREEN + "===== 所有单词复习完成!真棒!=====")

def main():
    """主函数:解析命令行参数,分发功能"""
    parser = argparse.ArgumentParser(
        description="📚 命令行单词记忆工具 - 结合JSON词库与艾宾浩斯复习算法",
        formatter_class=argparse.RawTextHelpFormatter
    )
    # 子命令
    subparsers = parser.add_subparsers(dest="command", required=True, help="子命令列表")
    
    # 子命令:初始化词库
    subparsers.add_parser("init", help="初始化JSON词库文件(vocab_lib.json)")
    
    # 子命令:添加单词
    add_parser = subparsers.add_parser("add", help="添加单词到词库")
    add_parser.add_argument("--eng", required=True, help="英文单词(如:abandon)")
    add_parser.add_argument("--chn", required=True, help="中文释义(如:v.放弃,抛弃)")
    
    # 子命令:查看词库
    show_parser = subparsers.add_parser("show", help="查看词库单词")
    show_parser.add_argument("--status", choices=["new", "pending", "mastered"], help="按状态筛选(new/pending/mastered)")
    
    # 子命令:开始复习
    subparsers.add_parser("review", help="开始复习(自动筛选待复习单词)")
    
    # 解析参数
    args = parser.parse_args()
    
    # 分发功能
    if args.command == "init":
        init_vocab_lib()
    elif args.command == "add":
        add_vocab(args.eng, args.chn)
    elif args.command == "show":
        show_vocabs(args.status)
    elif args.command == "review":
        review_vocabs()

if __name__ == "__main__":
    main()

工具完整使用教程

所有操作通过终端 / 命令行执行,进入代码所在目录,执行对应命令,以下是详细使用示例(Windows/Mac/Linux 通用)。

1. 初始化词库(首次使用必做)

创建空的vocab_lib.json词库文件:

bash

复制代码
python vocab_memory.py init

输出:词库初始化成功!已创建文件:vocab_lib.json

2. 添加单词

使用--eng指定英文,--chn指定中文释义,支持任意词性和多释义:

bash

复制代码
# 示例1:添加基础单词
python vocab_memory.py add --eng abandon --chn "v. 放弃,抛弃;n. 放任,放纵"
# 示例2:添加名词
python vocab_memory.py add --eng computer --chn "n. 计算机,电脑;计算器"
# 示例3:添加动词短语
python vocab_memory.py add --eng give up --chn "放弃;交出;投降"

输出:单词添加成功!【abandon】- v. 放弃,抛弃;n. 放任,放纵

3. 查看词库

查看全部单词

bash

复制代码
python vocab_memory.py show
按状态筛选查看
  • 查看新学 单词:python vocab_memory.py show --status new
  • 查看待复习 单词:python vocab_memory.py show --status pending
  • 查看已掌握 单词:python vocab_memory.py show --status mastered

输出:彩色格式化列表,包含单词、释义、状态、复习次数,清晰直观。

4. 开始核心复习(最常用功能)

自动筛选新学单词到时间的待复习单词,随机提问,根据你的掌握情况(y/n)自动更新复习计划:

bash

复制代码
python vocab_memory.py review
复习交互流程

plaintext

复制代码
===== 开始复习(共2个单词)=====
提示:输入【y】表示掌握,【n】表示未掌握,【q】退出复习

单词:abandon
是否掌握?(y/n/q):n
释义:v. 放弃,抛弃;n. 放任,放纵

未掌握,已重置复习计划!下次复习时间:2026-02-03 15:30:00

单词:computer
是否掌握?(y/n/q):y
释义:n. 计算机,电脑;计算器

掌握成功!下次复习时间:2026-02-05 15:30:00

===== 所有单词复习完成!真棒!=====

5. 手动编辑词库

若需要批量添加 / 修改单词,可直接用 ** 记事本 / VS Code/Notepad++** 打开vocab_lib.json,按既定格式编辑,示例:

json

复制代码
[
  {
    "english": "abandon",
    "chinese": "v. 放弃,抛弃;n. 放任,放纵",
    "status": "pending",
    "review_count": 0,
    "next_review": "2026-02-03 15:30:00"
  },
  {
    "english": "computer",
    "chinese": "n. 计算机,电脑;计算器",
    "status": "pending",
    "review_count": 1,
    "next_review": "2026-02-05 15:30:00"
  },
  {
    "english": "give up",
    "chinese": "放弃;交出;投降",
    "status": "new",
    "review_count": 0,
    "next_review": "2026-02-03 15:31:00"
  }
]

注意:编辑后保证 JSON 格式合法(无语法错误),工具可正常加载。

核心功能扩展(可选)

基于基础版本,可快速扩展以下实用功能,满足个性化需求:

1. 批量导入单词

创建batch_add.py,从 TXT/Excel 导入单词(示例:从 TXT 导入,每行格式英文|中文):

python

运行

复制代码
from vocab_memory import add_vocab

def batch_add_from_txt(txt_path):
    with open(txt_path, "r", encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if not line or "|" not in line:
                continue
            eng, chn = line.split("|", 1)
            add_vocab(eng, chn)

if __name__ == "__main__":
    batch_add_from_txt("word_list.txt")

TXT 文件word_list.txt格式:

plaintext

复制代码
abandon|v. 放弃,抛弃;n. 放任,放纵
computer|n. 计算机,电脑;计算器
give up|放弃;交出;投降

2. 单词拼写测试

修改review_vocabs函数,增加拼写模式(显示释义,让用户输入英文),提升记忆效果。

3. 复习提醒

添加定时任务(Windows 计划任务 / Mac/Linux crontab),每天固定时间执行python vocab_memory.py review,自动提醒复习。

4. 词库备份与导入

添加backuprestore子命令,将词库备份为 JSON 文件,或从备份文件恢复词库。

5. 按单词长度 / 难度筛选

扩展show命令,支持按英文长度、自定义难度标签筛选单词。

工具优势总结

  1. 轻量化:单文件,无复杂依赖,命令行运行,占用资源极少,可在服务器 / 终端随时使用;
  2. 科学记忆:基于艾宾浩斯遗忘曲线,动态调整复习间隔,比机械重复记忆效率提升数倍;
  3. 易扩展:JSON 词库可手动编辑 / 批量导入,Python 代码模块化,易添加新功能;
  4. 数据安全:所有操作实时保存到本地 JSON 文件,无网络依赖,不泄露个人记忆数据;
  5. 跨平台:支持 Windows/Mac/Linux,只要有 Python 环境即可运行。

这款工具完美结合了JSON 的灵活数据管理艾宾浩斯算法的科学记忆逻辑,既适合学生党背考研 / 四六级 / 雅思单词,也适合职场人积累商务英语词汇,定制专属词库,告别低效背单词!

相关推荐
芒克芒克2 小时前
LeetCode 题解:除自身以外数组的乘积
算法·leetcode
Python 老手2 小时前
Python while 循环 极简核心讲解
java·python·算法
@Aurora.2 小时前
优选算法【专题九:哈希表】
算法·哈希算法·散列表
爱看科技3 小时前
微美全息(NASDAQ:WIMI)研究拜占庭容错联邦学习算法,数据安全与隐私保护的双重保障
算法
qq_417129253 小时前
C++中的桥接模式变体
开发语言·c++·算法
YuTaoShao3 小时前
【LeetCode 每日一题】3010. 将数组分成最小总代价的子数组 I——(解法二)排序
算法·leetcode·排序算法
吴维炜5 小时前
「Python算法」计费引擎系统SKILL.md
python·算法·agent·skill.md·vb coding
Σίσυφος19006 小时前
PCL Point-to-Point ICP详解
人工智能·算法
玄〤6 小时前
Java 大数据量输入输出优化方案详解:从 Scanner 到手写快读(含漫画解析)
java·开发语言·笔记·算法