本文目录导读:

针对“脚本如何分类存储语录内容”这个问题,我们可以从结构化存储和内容分类逻辑两个核心维度来构建方案,以下是一套实用且可扩展的解决方案:
核心存储结构(推荐 JSON 格式)
脚本的核心是数据与逻辑分离,使用 JSON 作为存储格式,既易读又便于程序解析。
{
"metadata": {
"version": "1.0",
"source": "某部电影/某本书/用户原创",
"created_at": "2024-05-20"
},
"categories": {
"励志": {
"subcategories": {
"奋斗": [
{"id": "quote_001", "text": "路虽远,行则将至。", "author": "《荀子》", "tags": ["坚持", "行动"]},
{"id": "quote_002", "text": "...", ...}
],
"自信": [
{"id": "quote_003", "text": "...", ...}
]
}
},
"情感": {
"subcategories": {
"爱情": [{...}],
"友情": [{...}]
}
},
"哲理": {
"plain": [
{"id": "quote_050", "text": "存在即合理。", "author": "黑格尔", "tags": ["哲学", "理性"]}
]
}
},
"tags_index": {
"坚持": ["quote_001", "quote_010", "quote_022"],
"行动": ["quote_001", "quote_015"]
}
}
优势:
- 层级清晰:大类 → 子类 → 具体语录
- 标签索引:实现快速交叉检索(如:查找所有含“行动”标签的语录)
- 元数据独立:方便版本管理和溯源
分类逻辑设计(脚本中的关键函数)
在脚本中,你需要实现以下几个核心操作:
添加语录(带自动分类逻辑)
def add_quote(quote_text, author, primary_category, sub_category=None, tags=None):
"""
1. 校验主分类是否存在(如不存在则创建)
2. 校验子分类是否存在(如不存在则创建,或放入'other')
3. 生成唯一 ID(如时间戳+序号)
4. 存入对应分类数组
5. 更新 tags_index
6. 保存至文件
"""
pass
检索分类下的所有内容
def get_quotes_by_category(category, sub_category=None):
"""
返回指定分类(及子分类)下的所有语录列表
"""
pass
多标签交叉查询
def search_by_tags(required_tags, mode="AND"):
"""
mode="AND": 返回同时包含所有标签的记录
mode="OR": 返回包含任一标签的记录
"""
pass
增量更新(防止覆盖)
写文件时不要全量重写,而是:
- 读取原文件 → 更新内存结构 → 写回文件(或使用数据库,见下文)。
进阶方案(数据库型)
如果语录量较大(> 1000条)或需要频繁修改,建议使用 SQLite(无需安装,Python内置支持)。
表结构设计:
-- 分类表
CREATE TABLE categories (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
parent_id INTEGER DEFAULT NULL,
FOREIGN KEY (parent_id) REFERENCES categories(id)
);
-- 语录表
CREATE TABLE quotes (
id TEXT PRIMARY KEY,
text TEXT NOT NULL,
author TEXT,
category_id INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES categories(id)
);
-- 标签表(多对多关系)
CREATE TABLE tags (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL
);
CREATE TABLE quote_tags (
quote_id TEXT,
tag_id INTEGER,
PRIMARY KEY (quote_id, tag_id)
);
优势:
- 支持复杂查询(如:按分类统计数量、按时间排序)
- 事务支持,防止数据损坏
- 易于扩展(如增加“来源书籍”、“优先级”字段)
脚本示例(Python JSON 版)
一个简洁的增删改查脚本骨架:
import json
import uuid
from datetime import datetime
class QuoteManager:
def __init__(self, file_path="quotes.json"):
self.file_path = file_path
self.data = self._load()
def _load(self):
try:
with open(self.file_path, 'r', encoding='utf-8') as f:
return json.load(f)
except FileNotFoundError:
return {"metadata": {}, "categories": {}, "tags_index": {}}
def _save(self):
with open(self.file_path, 'w', encoding='utf-8') as f:
json.dump(self.data, f, ensure_ascii=False, indent=2)
def add(self, text, author, category, sub_category=None, tags=None):
if category not in self.data["categories"]:
self.data["categories"][category] = {}
if sub_category:
if sub_category not in self.data["categories"][category]:
self.data["categories"][category][sub_category] = []
target = self.data["categories"][category][sub_category]
else:
# 使用 'plain' 作为无子分类时的占位
self.data["categories"][category].setdefault("plain", [])
target = self.data["categories"][category]["plain"]
quote_id = str(uuid.uuid4())[:8]
target.append({
"id": quote_id,
"text": text,
"author": author,
"tags": tags or []
})
# 更新标签索引
for tag in (tags or []):
self.data["tags_index"].setdefault(tag, []).append(quote_id)
self._save()
return quote_id
def get_by_category(self, category, sub_category=None):
cat = self.data["categories"].get(category, {})
if sub_category:
return cat.get(sub_category, [])
# 合并该分类下所有子分类的语录
result = []
for sub, quotes in cat.items():
result.extend(quotes)
return result
def search_by_tag(self, tag):
ids = self.data["tags_index"].get(tag, [])
# 遍历所有分类找出匹配的语录
found = []
for cat in self.data["categories"].values():
for sub, quotes in cat.items():
for q in quotes:
if q["id"] in ids:
found.append(q)
return found
# 使用示例
qm = QuoteManager()
qm.add("知行合一", "王阳明", "哲理", sub_category="中国哲学", tags=["行动", "认知"])
rs = qm.get_by_category("哲理", "中国哲学")
print(rs)
存储介质建议
| 场景 | 推荐方式 | 理由 |
|---|---|---|
| 个人博客 / 静态站点 | JSON + Markdown | 易维护,可配合 Next.js 等生成静态页面 |
| 多人协作 / 需要搜索 | SQLite 或 PostgreSQL | 支持复杂查询,数据一致性好 |
| 移动端 / 离线使用 | SQLite(Room 或 Core Data) | 本地存储,无需网络 |
| 云端 / 需要同步 | Firebase Firestore 或 Supabase | 实时同步,客户端直接读写 |
伪代码(完整流程)
初始化
- 读取存储文件(JSON 或连接 DB)
- 检查 structure 是否合法
2. 用户输入
- 文本内容
- 作者(可选)
- 主分类(必选,可用下拉选择或自动检测)
- 子分类(可选)
- 标签(可选,逗号分隔)
3. 脚本处理
- 校验:主分类是否存在,是否不允许重复
- 分配唯一 ID(UUID 或自增数字)
- 存入对应分类数组
- 更新标签倒排索引
4. 存储
- 写回文件(JSON 全量写)或执行 INSERT(SQL)
5. 输出
- 成功提示 + 语录 ID
- 可选:自动生成分类树统计(如:励志类 15条,情感类 8条)
常见面试追问及回答要点
-
“如何实现模糊搜索?”
答:在 JSON 方案中遍历所有语录,用if keyword in quote["text"];在 SQL 中使用LIKE '%keyword%',更高效的做法是建立倒排索引(如 Elasticsearch),但对于小数据量,简单的字符串匹配足够。 -
“如果我想支持多级子分类(如 励志 > 奋斗 > 学习)怎么办?”
答:将分类设计为树形结构,存储时每个节点记录parent,JSON 方案可使用嵌套字典,SQL 方案使用parent_id外键。 -
“怎么保证标签同义词统一?”
答:在标签处理函数中做规范映射(如“dream”和“梦想”都归一化到“梦想”),或在添加时提供标签推荐/自动补全。