本文目录导读:

针对“脚本如何分类存储语录内容”这个问题,我们可以从结构化存储和内容分类逻辑两个核心维度来构建方案,以下是一套实用且可扩展的解决方案:
核心存储结构(推荐 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”和“梦想”都归一化到“梦想”),或在添加时提供标签推荐/自动补全。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播