简介一套覆盖网络安全、安全协议、IPsec 与 SSL/TLS 的信息安全考试题库面向高校信息安全专业学生、考研复习者及准备相关认证的技术人员。题目以填空题和选择题为主内容涵盖网络安全的定义与安全协议分类、安全性质IPsec 的设计目标、工作模式及 AH/ESP/IKE 组成SSL 的分层结构、握手阶段、RSA 认证与密钥交换机制同时整理了 PPP 协议目的、IP 数据包格式等基础知识点与常见教材考点贴合度高像预主秘密生成主秘密、传输模式与隧道模式的区别这类高频易错点均有体现。压缩包内共1个doc文件约184KB内容紧凑按知识点分块排列可直接打印或导入阅读器刷题答案置于题干后的括号中便于对照复习、快速定位薄弱环节。目前已有1924人学习下载适合期末冲刺、考研复习或信息安全认证备考时集中演练通过反复自测帮助巩固高频概念、辨析易混原理提升对安全协议整体框架的掌握。1. 一份 Word 题库文档为什么值得先花一整晚整理备考软考信息安全工程师或计算机三级信息安全的同学多多少少都遇到过一份“信息安全考试题库.doc”几百页、上万道题从网盘或同事那边拿到打开刷十分钟就放弃。我自己第一年备考也这样硬刷被重复题、错答案和过时题反复折磨上了考场才发现漏了一大块知识盲区。这份题库看起来只是“题 答案”但要让它真正帮你拿分得把它当成待清洗的数据源而不是普通文档。下面会按“体检 → 结构化 → 刷题闭环 → 避坑 → 冲刺”的顺序把它变成自己的备考系统。适合软考中级信息安全工程师、计算机三级信息安全、网信技能竞赛等方向的备考生。2. 先给题库做“体检”识别来源、题量与过时内容拿到 doc 后别急着从第一页开始刷先把这个文件当成黑匣子做检测。这一步决定了后面清洗规则怎么写也决定哪些章节可以直接放弃省下大量无用功。2.1 从文档属性、页眉页脚和修订痕迹判断题库来源先把文件下载到本地右键查看属性点“详细信息”标签看创建时间、修改时间、作者和公司。如果创建时间在两三年以前且作者位置挂着某个培训机构名字这份题库的合规题大概率已经过时如果文档属性里的“公司”填的是“Microsoft”说明整理者也懒得填内容可信度要打折。看完属性再用 Word 打开直接看页眉页脚。机构内部资料常带“仅供内部使用”“XX教育版权所有”水印这类文档的答案错漏率通常比官方真题整理稿高。接着打开“文件 → 信息 → 属性 → 高级属性”看标题、关键词和备注很多整理者会把来源版本写在备注里比如“根据 2018 版大纲整理”“2021 年真题补录”。这一步能省掉后面猜版本的时间。然后再按 CtrlEnd 跳到文档末尾看有没有“修订记录”或“勘误表”。有勘误表的文档值得花时间整理因为它说明原整理者在持续维护没有勘误表还带一堆修订痕迹的说明作者自己都没定稿答案需要逐条核对。还有一个细节看目录里是否标注真题年份。真正的真题整理稿会在章节后写“2018—2022 真题”如果整套题库只有“第一章、第二章”这种结构大概率是模拟题汇编不能当真题背。最后开导航窗格看章节结构如果文档目录用的是“第一章、第二章”这种通用命名而不是官方考试大纲的“安全基础知识、网络安全技术、安全管理与法规”说明题目是随手粘贴的。此时我一般会在 Excel 里先建一个“章节映射表”把 Word 的自定义章名映射到考试大纲章名再返回来给后续结构化数据打标签。2.2 用 Python 统计题量、重复率与题型分布肉眼检查完用脚本把题目空间摸一遍。这里常见做法是先用 LibreOffice 的无头模式把 .doc 转成 .docx再用 python-docx 读取段落。python-docx 不直接支持 .doc 老格式所以转换这步不能省。转换命令如下libreoffice --headless --convert-to docx 信息安全考试题库.doc --outdir ./converted # 转换后用 ls 确认文件名和大小避免空文件 ls -lh ./converted转换成功后用下面这段代码统计疑似题目数、选项数和答案分布。这里不要求一次到位能看出整体面貌即可。from docx import Document import re doc Document(converted/信息安全考试题库.docx) paragraphs [p.text.strip() for p in doc.paragraphs if p.text.strip()] question_start re.compile(r^\d[.、]) option_start re.compile(r^[A-H][.、:]) q_num 0 opt_num 0 ans_count {A: 0, B: 0, C: 0, D: 0, E: 0} for para in paragraphs: if question_start.match(para): q_num 1 elif option_start.match(para): opt_num 1 elif para.startswith(答案): m re.search(r[A-E]{1,5}, para) if m: for ch in m.group(): if ch in ans_count: ans_count[ch] 1 print(f疑似题目数: {q_num}) print(f选项行数: {opt_num}) print(f答案分布: {ans_count})逻辑很简单按“数字 点”开头识别题干按“大写字母 点/冒号”识别选项按“答案”开头的行提取答案字母。回答几个常见疑问为什么答案分布能反映可信度因为一份正常考卷选择题答案分布是接近均匀的如果 A 占 40%多半是整理者只填到自己写错的选项或答案行识别错位。如果 q_num 是整数且接近 1000/2000说明题目大概率是从不同来源拼合后面去重压力不小。脚本跑完如果 q_num 为 0不用急着改正则先打印前 50 个段落看看格式。很多老题库用“一、”“1”或“【1】”开头这时候把 question_start 改成对应前缀即可。最常见的误用是直接对 .doc 调用 python-docx结果抛PackageNotFoundError这不是代码问题而是必须先用 LibreOffice 转换。另一个常见误用是只统计普通段落忽略表格里的题目如果题量比文档目录宣称的少很多要检查是不是题目都塞在表格里。如果答案分布非常均匀比如每 4 题严格按 A、B、C、D 循环说明题库很可能是程序生成的模拟题选项顺序没有随机化实际考试不会这么规律刷这种题时要手动把选项顺序打乱避免记住位置而不记知识。2.3 用合规时间线标记过时题别让旧答案带偏复习方向信息安全题库最大的坑不是做错一道题而是背牢一套已经失效的合规答案。比如等保 2.0 在 2019 年实施后旧题里“五级分级描述”“物理隔离”的表述就和现行标准对不上《密码法》生效后旧题库里“商用密码管理条例”的答案也不再适用。判断哪些题过时不用逐条看先在题库里搜几个敏感词grep -n 等保1.0\|分级保护\|商用密码管理条例旧\|信息安全等级保护管理办法试行 题库暂存.txt搜出来的题不能直接删要做标记。因为考试大纲可能仍然保留“等级保护”考点旧题的价值在于帮助你理解概念只是答案需要换新。我一般会在题库系统里给这些题打上obsolete状态等第 3 章结构化后再统一筛选。归纳一张常用的合规时间线表方便对照考点领域过时信号现行依据等级保护“等保 1.0”“分级保护”等保 2.0 及配套标准密码管理“商用密码管理条例旧版”密码法及其实施条例数据安全只提“个人信息保护”数据安全法、个人信息保护法风险评估“风险评估规范旧版”最新版 GB/T 20984这张表不是让你背而是作为筛选条件写进后续查询。比如第 3 章建表后可以直接按“含等保 1.0 关键词”的定语去更新状态比一道一道人工看快得多。还有一个更轻量的办法把题库目录和官方考纲目录放在同一张 Excel 里逐行对比多出来的章节点名看比如“黑客攻防”“内网渗透”这类偏实战的章节如果不在你报考的科目范围内标成超纲即可不用浪费时间纠结答案。标记完过时题后正式开刷前再跑一次统计看看 active 状态还剩多少题。如果删掉 obsolete 后只剩几百道说明原始题库含水量很高需要回到资料群补新题别指望一份题库打天下。3. 把 .doc 转成结构化题库格式清洗与字段抽取第 2 章解决了“题库是什么”这一章解决“题库怎么存”。目标是把几百页 Word 变成一张张可以查询、可以过滤、可以导入刷题软件的表。3.1 从 Word 到结构化文本的转换管线我用的转换管线是doc → LibreOffice 无头转 docx → python-docx 提取段落 → Markdown/CSV。为什么不用在线转换因为本地转换不会把文档里的图片、公式和特殊符号悄悄换掉而且可以批量处理几十份文件。转换命令已经在 2.2 出现过这里不再重复重点说读取细节。读取时要用doc.paragraphs按段落级别取文本而不是先复制到纯文本再读。段落级别能保留每行是题干还是选项的语义后面正则切分容易很多。下面这段代码把文档里所有非空段落写入 Markdownfrom docx import Document doc Document(converted/信息安全考试题库.docx) lines [] for p in doc.paragraphs: t p.text.strip() if not t: continue lines.append(t) with open(题库.md, w, encodingutf-8) as f: f.write(\n.join(lines)) print(f写入 {len(lines)} 行)关键参数在p.text.strip()去掉首尾空格能避免把“答案A”误判成“A 答案”。但 strip 只处理 ASCII 空格和中文全角空格如果是不断行空格\u00a0需要额外替换。失败时看什么如果写入行数远小于文档页数先打开 docx 看看题目是不是放在表格里是的话用doc.tables再补一遍for table in doc.tables: for row in table.rows: for cell in row.cells: t cell.text.strip() if t: lines.append(t)这段代码把表格单元格内容追加到 lines 末尾注意顺序可能被打乱。想保留原始顺序需要遍历doc.element.body按文档顺序取出段落和表格我一般偷懒先把普通段落写入一个列表表格内容写入另一个列表最后人工按“疑似题号”排序合并。3.2 用正则表达式切分题干、选项、答案与解析题库格式再怎么乱常见格式逃不过数字序号开头、选项按 A/B/C/D 换行、答案跟在“答案”后面、解析跟在“解析”后面。下面这段正则抽取逻辑能处理大部分情况先把每道题切成一个字典import re with open(题库.md, r, encodingutf-8) as f: content f.read() block_re re.compile( r(?Pq\d[.、]\s*(?Ptext.*?)) r(?Popts(?:\s*[A-H][.、:].*?)) r(?:\s*答案[:]\s*(?Pans[A-H]{1,5}))? r(?:\s*解析[:]\s*(?Pana.*?))?(?\n\s*\d[.、]|\Z), re.S ) records [] for m in block_re.finditer(content): records.append({ q: m.group(text).strip(), opts: m.group(opts).strip(), ans: m.group(ans) or , ana: m.group(ana).strip() if m.group(ana) else , }) print(f解析到 {len(records)} 题)这段正则的核心是.*?的惰性匹配和(?\n\s*\d[.、]|\Z)的前瞻断言。前瞻断言保证每条题在遇到下一个“数字 点”时结束而不是贪婪地吞到文档末尾。如果某道题没有选项判断题opts组会为空需要后续用判断题规则单独处理。跑完随机打印 20 条检查切分是否错位。最高频的错位来自三种情况一是题干和选项在同一行比如“1. 下列哪项属于对称加密算法 A. DES B. RSA”此时opts组会匹配整行需要把题干组的结束位置扩展到“第一个大写字母 点”之前。二是“答案A 解析xxx”写在同一行此时ans组会匹配成“A 解析xxx”。解决方式是先把答案行按空格或中文分号拆开再分别取答案和解析。三是选项中间有空行\s*会吃掉换行结果把下一个选项也吞进来这种情况需要把空行先替换成 \n 再跑。参数上我建议把[A-H]改成[ABCDEF]防止题库用 I/O 等字母做干扰项时把“I.”误判成选项。多选题答案长度用{1,5}足够覆盖大多数情况如果遇到 6 个选项的题再手动放宽。3.3 设计题库表结构用 SQLite 管理题目、状态和错题记录清洗完的题目要落库。很多人直接存 Excel但 Excel 在几千行以上时筛选慢而且多列文本复制粘贴容易错位。我更习惯用 SQLite单文件、零配置考试结束还能整个打包归档。建表语句如下CREATE TABLE questions ( id INTEGER PRIMARY KEY AUTOINCREMENT, source TEXT NOT NULL, subject TEXT NOT NULL, chapter TEXT NOT NULL, qtype TEXT NOT NULL, difficulty TEXT DEFAULT 中, question TEXT NOT NULL, options TEXT, answer TEXT NOT NULL, analysis TEXT, status TEXT DEFAULT active, wrong_count INTEGER DEFAULT 0, last_wrong_at DATE, created_at DATE DEFAULT (date(now)) );逐行解释关键字段source记录这份题来自原始题库的哪一部分方便日后和官方真题核对chapter按考试大纲命名这是后面所有按章节刷题和组卷的地基options用 JSON 存比如{A:DES,B:RSA,C:AES,D:3DES}好处是导出到不同刷题软件时可以灵活拼字符串不用拆列status有三个值active正常刷、obsolete过时或超纲、pending答案待核对。建表后批量插入数据用executemany比逐条execute快很多import sqlite3, json conn sqlite3.connect(tiku.db) records [...] # 上一步切分出的 records data [ ( netease_tiku, 信息安全基础知识, 密码学, 单选, r[q], json.dumps(parse_opts(r[opts]), ensure_asciiFalse), r[ans], r[ana], active ) for r in records ] conn.executemany( INSERT INTO questions (source, subject, chapter, qtype, question, options, answer, analysis, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?), data ) conn.commit()这个过程中我踩过最深的坑是拿“题号”当主键。同一道题在不同来源里编号必然冲突插入第二次就报错。后来我用自增id当主键原题号存放在一个orig_number字段里只用于追溯 Word 文档位置不再参与业务逻辑。如果你的题库要长期维护建议一开始就加上created_at和updated_at后面做增量更新时能省很多事。4. 刷题闭环把题库变成可随机抽题、可追踪错题的复习系统题库建好了接下来不是打开文档从头看到尾而是用系统对抗遗忘。我建议两条腿走路导入 Anki 做碎片时间记忆再写一个本地随机抽题脚本做每日小测。4.1 把题库转成 Anki 卡包的最小实现Anki 适合做单选、多选、判断题的闪卡尤其是密码学、合规时间线这类记忆密度高的章节。从 SQLite 导出 CSV 再导入 Anki注意 CSV 编码必须用utf-8-sig否则中文在 Anki 里会变乱码。下面这段代码导出所有有效选择题import sqlite3 import csv conn sqlite3.connect(tiku.db) rows conn.execute( SELECT question, options, answer, analysis, chapter FROM questions WHERE status active AND qtype IN (单选, 多选, 判断) ORDER BY chapter ).fetchall() with open(anki_cards.csv, w, encodingutf-8-sig, newline) as f: writer csv.writer(f) writer.writerow([front, back, tags]) for q, opts, a, ana, ch in rows: front q if opts: front \n opts back f{a} if ana: back f\n{ana} writer.writerow([front, back, ch])说明几个关键字段front是把题干预选拼在一起保证 Anki 正面就是一道完整的选择题back是答案加解析解析跟答案放同一面刷完马上能看到原因记忆留存率高很多tags直接放章节名Anki 里可以按标签筛选。导入 Anki 时类型选“基础加强回忆”字段映射别搞反。最常见的问题是换行符变成空格题目挤在一行原因是 CSV 里的\n被 Excel 转义了。解决方法是导入前先用文本编辑器确认front是否保留了换行或者导入类型里手动选择“允许 HTML”并把段落分隔符设为br。如果题库量超过一万CSV 导入时间会稍长导入后先抽几张卡检查格式再开始刷。4.2 自制乱序抽题与错题重刷脚本Anki 能解决记忆但解决不了“考场环境的陌生感”。考场题目是乱序的没有提示该选 A 还是 D所以每周还要跑一次本地抽题脚本。下面的脚本按章节权重抽取题目并自动回写错题状态import sqlite3 import random conn sqlite3.connect(tiku.db) chapters [安全基础知识, 密码学, 网络安全技术, 安全管理, 等保与合规] pool_size {安全基础知识: 5, 密码学: 6, 网络安全技术: 8, 安全管理: 6, 等保与合规: 5} selected [] for ch, num in pool_size.items(): rows conn.execute( SELECT id, question, options, answer, analysis FROM questions WHERE status active AND chapter ? ORDER BY CASE WHEN wrong_count 0 THEN 0 ELSE 1 END, RANDOM() LIMIT ?, (ch, num) ).fetchall() selected.extend(rows) random.shuffle(selected) score 0 for qid, q, opts, ans, ana in selected: print(f\n{qid}. {q}) print(opts) user_ans input(你的答案).strip().upper() if user_ans ans: score 1 print(正确) else: print(f正确答案{ans}) if ana: print(f解析{ana}) conn.execute( UPDATE questions SET wrong_count wrong_count 1, last_wrong_at date(now) WHERE id ?, (qid,) ) conn.commit() print(f\n得分{score}/{len(selected)})这里最值得说的不是随机抽取而是ORDER BY CASE WHEN wrong_count 0 THEN 0 ELSE 1 END。这个写法让做错过的题优先被抽到实现“错题重刷”比单纯RANDOM()更贴合备考需求。wrong_count从第 3 章的表结构来每次答错自动加一刷题记录也随之更新。pool_size是一份简易考点权重你可以按自己薄弱章节调整。比如密码学只有 6 题但你连续错 4 题就把权重改成 10。脚本里input要求人工输入答案多选答案要连写比如ABD。如果输入小写也没关系.upper()会转换。如果题库里有“判断题”opts为空打印时没有选项需要手动调整输出格式避免刷题时一堆空白行。4.3 针对软考密码学 RSA 计算题的专项练习法RSA 是软考信息安全工程师里最容易拿分也最容易丢分的计算题。套路固定给两个质数 p、q 和公钥 e求 n、φ(n)、d 或加密密文。我在题库系统里单独给 RSA 题打标签并把计算步骤写进解析。看一个常见例题p61q53e17加密明文 65。用 Python 验算p, q, e 61, 53, 17 n p * q phi (p - 1) * (q - 1) def modinv(a, m): m0, x0, x1 m, 0, 1 while a 1: q a // m m, a a % m, m t x1 - q * x0 x1, x0 x0, t return x1 % m0 d modinv(e, phi) c pow(65, e, n) print(fn{n}, phi{phi}, d{d}) print(f密文 c {c}) # 输出 n3233, phi3120, d2753, 密文2790modinv实现扩展欧几里得算法考试时可以改成手动试除从 1 开始逐个试 d直到(d * e) % phi 1。题目里 e 通常比较小比如 17试除最多也就几十次。这里提醒一个常见误用很多人把phi记成n p * q结果算 d 时用n代替(p-1)*(q-1)下一步全错。phi专指欧拉函数不是 n。专项练习时我会把题库里的 RSA 题参数随机化生成新题随机选两个互异质数 p、q随机选一个与 phi 互质的 e然后重新计算答案。生成时要加一个判断条件import math, random def gen_rsa(): while True: p random.choice([17, 19, 23, 29, 31, 37, 41, 43]) q random.choice([53, 59, 61, 67, 71]) if p q: continue phi (p - 1) * (q - 1) e random.choice([3, 5, 7, 11, 17, 13, 19]) if math.gcd(e, phi) 1: return p, q, e, phi这组参数里 p、q 来自小质数池方便手算。math.gcd(e, phi) 1是必须的筛选条件否则私钥 d 不存在。生成的题可以自动插入questions表source字段标记为“自动生成”analysis里带上完整的中间步骤。这样一来每次刷 RSA 遇到“答案背过但不理解”的概率大大降低。5. 题库避坑指南从答案错误到乱码重复我踩过的五个坑题库整理过程里最花时间的不是写代码而是清理脏数据。这一章我按“现象 → 原因 → 解决”写五条高频踩坑记录希望你遇到时不用再翻一遍 Word。5.1 同一道题两个答案两条都说得通时怎么办现象某道关于 DES 密钥长度的题题库答案是“56 位”后面又出现一道几乎相同的题答案却是“64 位”。原因第一题问的是“有效密钥长度”第二题问的是“密钥总位数含校验位”两个说法在不同教材里都有依据。解决不要自己“二选一”把两道题同时抽出来翻官方教材或近三年真题确认原题措辞。确认后把仍然存疑的题设为pending在analysis里写明依据。我一般会用知识点关键词搜索比如搜“DES 有效密钥”把 3 个来源的答案贴在解析后面而不是直接改答案。这里我还会在题库系统里加一个勘误视图把pending的题按章节分组每周集中核对一次。核对时优先看官方指定教材其次看近三年真题解析最后才看论坛讨论避免被同样困惑的人带偏。5.2 Word 转文本后公式和特殊符号乱码现象密码学公式转成 Markdown 后≡变成?上标x^2变成x2个别选项还出现“A”被拆成“A?”。原因Word 里的公式是嵌入对象或域代码纯文本抽取只能拿到近似结果字体转码也会丢字符。解决转换前先用 Word 把 .doc 另存为 .docx再用 LibreOffice 转一次。两次转换能补掉大部分问题。如果还残留乱码就加一个替换表replace_map { : ?, ×: *, ≤: , : ., } for k, v in replace_map.items(): text text.replace(k, v)注意替换表不能把中文标点的全角句号“。”也换成半角否则会影响正则里题干结束符的判断。判断乱码是否处理干净随机挑 20 道数学题打印题干和选项人工看一遍比写自动化检查更高效。如何快速判断公式是否丢完整抽几道 RSA 题看解析里有没有模符号抽几道网络题看 IP 地址有没有被替换成乱码。如果乱码集中在少数几章可以只修那几章的原始 doc不用全文重新转。5.3 重复题和“换皮题”让刷题量虚高现象统计有 3000 题去重后只剩 1800 题。原因同一道题被多个机构收录选项顺序被调整或题干里的“某公司”被替换成“某系统”。解决先对题干做 MD5 去重再做“只保留中文、数字和英文”的指纹去重import hashlib import re from collections import defaultdict def fingerprint(text): text re.sub(r[^0-9A-Za-z\u4e00-\u9fa5], , text) return hashlib.md5(text.encode(utf-8)).hexdigest() seen defaultdict(list) for qid, q_text in questions: fp fingerprint(q_text) if fp in seen: print(f疑似重复{seen[fp]} 与 {qid}) else: seen[fp] qid这个脚本跑完重复题会输出到屏幕。题干完全相同但选项顺序不同的指纹相同可以放心合并只改名词的题指纹不同但高度相似再用difflib.SequenceMatcher(None, a, b).ratio()计算相似度阈值设在 0.9 左右。阈值设太高会把换皮题漏掉设太低又会误杀正经相似题安全起见高于 0.9 的输出到“待人工确认”表。换皮题的去重优先级是先查题干指纹再查选项指纹最后查解析相似度。为什么选项指纹优先级高因为换皮题通常保留正确选项的文字只改错误选项如果题干已经被改得面目全非选项文字往往还留着原始痕迹。5.4 超纲题和偏怪题干扰复习节奏现象题库里混着大量不在报考科目范围内的内容比如“XX 工具的具体命令参数”和“国外某标准的历史沿革”。原因综合题库为了显得全把多门课内容打包在了一起。解决用官方大纲建一个“允许章节列表”然后批量标记UPDATE questions SET status obsolete WHERE chapter NOT IN ( 安全基础知识, 安全技术, 安全管理, 安全法规与标准 );执行前先确认自己的考试科目和官方大纲章名不同考试章节命名差异很大。比如软考中级信息安全工程师的“安全技术”章节会把密码学、访问控制、入侵检测等细分内容都放在里面计算机三级信息安全的考法更偏基础主要考概念而不是配置命令。所以“允许章节列表”要按你当前备考的考试单独维护。超纲题不一定要删掉推荐留作obsolete而不是物理删除。因为很多综合题会从超纲知识里引一个干扰项比如密码学题里出现“彩虹表”大纲不要求你计算但要求你能识别。这类题适合留在库里当扩展阅读只是不进入每日抽题池。5.5 网盘资料混杂宏、密码和残缺文件现象从网盘或群里拿到的“信息安全考试题库.doc”打开提示“此文档包含宏”有的文档本身加密密码写在下载页。原因部分资料传播时被重新打包加宏可能是为了展示答案也可能藏了脚本。解决只要文档要求“启用宏”才能显示内容我直接弃用不值得为题库冒这个风险。普通加密文档可以用 Word 自带的“保护文档”解除但如果密码复杂建议直接换个来源重新下载。另一个更隐蔽的问题是文件残缺在线预览能看前 50 页下载后打开只有目录和后几章。验证方法是按住 CtrlEnd 跳到最后再对照导航窗格的标题数量。如果发现某章在目录里存在但正文找不到赶紧换版本别等到考前才发现题库缺了一章。验证 doc 文件是否完整还可以按 CtrlF 搜索目录最后一个关键词比如目录最后一节是“应急响应”正文里必须能搜到这个词搜不到就要果断换版本。另外下载后先右键属性看大小如果只有几十 KB大概率是坏文件。6. 考前两周用题库生成模拟卷与错题复盘表到冲刺阶段刷题的重点从“量”转向“配比”和“复盘”。我习惯用脚本一次性输出两样东西一套按章节权重随机生成的模拟卷一份只针对错题的复盘表。模拟卷生成和 4.2 的抽题脚本类似但多了两个限制每题尽量来自不同知识点且最近一周做错的题优先出现。知识点去重用DISTINCT chapter很难做到我一般会先按keyword分组再在每组里随机取一题。错题复盘表直接从 SQLite 导出用 pandas 写入 Excelimport sqlite3 import pandas as pd conn sqlite3.connect(tiku.db) # 只导出答错过且仍有效的题按最近出错时间倒序 df pd.read_sql_query( SELECT id, chapter, question, answer, wrong_count, last_wrong_at FROM questions WHERE wrong_count 0 AND status active ORDER BY last_wrong_at DESC , conn) df.to_excel(错题复盘.xlsx, indexFalse)代码里wrong_count 0是核心过滤条件ORDER BY last_wrong_at DESC保证最近出错的内容排最前面。chapter字段让你一眼看出哪一章错得最多考前一天就专攻那几章的错题。生成表格后我会在每题旁边手写一列“错因”比如“记混公式”“忽略条件”。这个动作看着笨但对考前最后一天的复习特别有用。现在我养成的习惯是每周跑一次抽题脚本每次出错都写一句错因考前三天的早晚只翻错题表里反复出现的内容。这套方法帮我从“刷题上瘾但记不住”的状态里走出来也算是我整理“信息安全考试题库.doc”这类资料的最大心得。希望帮到你。本文还有配套的精品资源点击获取
