本文将手把手教你打造一款轻量、高效的Python 命令行单词记忆工具 ,核心结合JSON 格式词库 (易读写、可扩展)和艾宾浩斯遗忘曲线复习算法(科学记忆、抗遗忘),无需复杂框架,仅用 Python 内置库 + 少量第三方依赖,跨平台支持 Windows/Mac/Linux,适合日常背单词、定制专属词库。
工具核心设计
1. 核心功能
- 词库管理:初始化 JSON 词库、添加单词、查看词库、按状态筛选(新学 / 待复习 / 已掌握)
- 科学复习:基于艾宾浩斯遗忘曲线,自动计算单词下次复习时间,按记忆状态推送复习内容
- 命令行交互:简洁的终端操作、彩色提示、输入校验,无需图形界面,轻量化运行
- 数据持久化:所有单词和记忆状态实时保存到 JSON 文件,关闭工具不丢失数据
2. 技术选型
- 开发语言:Python3.6+(语法简洁、内置 JSON 处理、跨平台)
- 词库格式:JSON(易手动编辑、程序读写高效,可直接用记事本 / 编辑器修改)
- 复习算法:艾宾浩斯遗忘曲线(核心是按复习次数动态调整复习间隔)
- 终端交互:
argparse(命令行参数解析)、colorama(终端彩色输出,提升体验) - 内置依赖:
json(词库读写)、datetime(时间计算)、os(文件路径处理)、random(随机抽题)
3. 艾宾浩斯复习算法落地规则
结合单词记忆特点,简化并落地经典艾宾浩斯曲线,核心是根据复习次数设置不同的复习间隔,未掌握则重置间隔,掌握则逐步延长,最终达到长期记忆:
- 新学单词(复习次数 = 0):首次复习间隔1 天
- 第 1 次复习通过:下次复习间隔2 天(累计 3 天)
- 第 2 次复习通过:下次复习间隔4 天(累计 7 天)
- 第 3 次复习通过:下次复习间隔7 天(累计 14 天)
- 第 4 次复习通过:下次复习间隔15 天(累计 29 天)
- 第 5 次复习通过:标记为已掌握,不再参与常规复习
- 任意一次复习未通过:重置复习次数为 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. 词库备份与导入
添加backup和restore子命令,将词库备份为 JSON 文件,或从备份文件恢复词库。
5. 按单词长度 / 难度筛选
扩展show命令,支持按英文长度、自定义难度标签筛选单词。
工具优势总结
- 轻量化:单文件,无复杂依赖,命令行运行,占用资源极少,可在服务器 / 终端随时使用;
- 科学记忆:基于艾宾浩斯遗忘曲线,动态调整复习间隔,比机械重复记忆效率提升数倍;
- 易扩展:JSON 词库可手动编辑 / 批量导入,Python 代码模块化,易添加新功能;
- 数据安全:所有操作实时保存到本地 JSON 文件,无网络依赖,不泄露个人记忆数据;
- 跨平台:支持 Windows/Mac/Linux,只要有 Python 环境即可运行。
这款工具完美结合了JSON 的灵活数据管理 和艾宾浩斯算法的科学记忆逻辑,既适合学生党背考研 / 四六级 / 雅思单词,也适合职场人积累商务英语词汇,定制专属词库,告别低效背单词!