纯人工智能写的一个东西,没有优化只能导入csv题库严格按照[Asm] 纯文本查看 复制代码 题干,选项A,选项B,选项C,选项D,参考答案,详细解析,
题目1,AAA、BBB,CCC,DDD,A,解析,
题目2,AAA、BBB,CCC,DDD,ABC,解析,
题目3,AAA、BBB,,,A,解析,
单选,多选,判断
题库检测脚本
[Python] 纯文本查看 复制代码 #!/usr/bin/env python3
"""
CSV 题库检测脚本
用法: python check_csv.py <your_file.csv>
"""
import csv
import sys
import io
from pathlib import Path
def check_csv(filepath: str):
path = Path(filepath)
if not path.exists():
print(f"❌ 文件不存在: {filepath}")
sys.exit(1)
# 读取原始内容,自动处理 BOM
raw = path.read_bytes()
content = raw.decode("utf-8-sig") # utf-8-sig 自动去掉 BOM
reader = csv.reader(io.StringIO(content))
rows = list(reader)
if not rows:
print("❌ 文件为空")
sys.exit(1)
header = rows[0]
print(f"📋 表头: {header}")
print(f"📊 总行数(含表头): {len(rows)}")
print(f"📊 数据行数: {len(rows) - 1}")
print("-" * 60)
ok_count = 0
skip_count = 0
issues = []
for i, row in enumerate(rows[1:], start=2): # 从第2行开始(第1行是表头)
line_issues = []
# ── 基础检查 ──────────────────────────────────────────
if len(row) < 6:
line_issues.append(f"列数不足(只有 {len(row)} 列,至少需要 6 列)")
issues.append((i, row, line_issues))
skip_count += 1
continue
stem = row[0].strip()
opt_a = row[1].strip() if len(row) > 1 else ""
opt_b = row[2].strip() if len(row) > 2 else ""
opt_c = row[3].strip() if len(row) > 3 else ""
opt_d = row[4].strip() if len(row) > 4 else ""
answer = row[5].strip().upper() if len(row) > 5 else ""
# ── 题干检查 ──────────────────────────────────────────
if not stem:
line_issues.append("题干为空")
# ── 选项检查 ──────────────────────────────────────────
valid_opts = {k: v for k, v in zip("ABCD", [opt_a, opt_b, opt_c, opt_d]) if v}
if len(valid_opts) < 2:
line_issues.append(f"有效选项不足2个(A='{opt_a}' B='{opt_b}' C='{opt_c}' D='{opt_d}')")
# ── 答案检查 ──────────────────────────────────────────
if not answer:
line_issues.append("答案为空")
else:
invalid_letters = [c for c in answer if c not in valid_opts]
if invalid_letters:
line_issues.append(
f"答案包含无效选项字母 {invalid_letters}(有效选项: {list(valid_opts.keys())})"
)
# 题型推断
if len(valid_opts) == 2:
qtype = "判断题"
elif len(answer) == 1:
qtype = "单选题"
else:
qtype = "多选题"
# 多选题但答案只有1个字母(可能是数据问题)
if qtype == "多选题" and len(answer) == 1:
line_issues.append(f"推断为多选题但答案只有1个字母: '{answer}'")
# ── 汇总 ──────────────────────────────────────────────
if line_issues:
issues.append((i, row, line_issues))
skip_count += 1
else:
ok_count += 1
# ── 输出结果 ──────────────────────────────────────────────
print(f"✅ 有效题目: {ok_count}")
print(f"❌ 有问题行: {skip_count}")
print()
if not issues:
print("🎉 所有题目格式正确!")
return
print(f"{'行号':<6} {'问题描述':<50} {'题干预览'}")
print("-" * 100)
for line_no, row, errs in issues:
stem_preview = (row[0][:30] + "...") if len(row[0]) > 30 else row[0]
stem_preview = stem_preview.replace("\n", "\\n")
for j, err in enumerate(errs):
if j == 0:
print(f"{line_no:<6} {err:<50} {stem_preview}")
else:
print(f"{'':6} {err}")
print()
# ── 导出问题行到文件 ──────────────────────────────────────
out_path = path.with_name(path.stem + "_issues.txt")
with open(out_path, "w", encoding="utf-8") as f:
f.write(f"文件: {filepath}\n")
f.write(f"总数据行: {len(rows)-1},有效: {ok_count},有问题: {skip_count}\n\n")
for line_no, row, errs in issues:
f.write(f"第 {line_no} 行:\n")
f.write(f" 原始内容: {row}\n")
for err in errs:
f.write(f" ⚠ {err}\n")
f.write("\n")
print(f"📄 详细报告已保存到: {out_path}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法: python check_csv.py <your_file.csv>")
sys.exit(1)
check_csv(sys.argv[1])
还有很大改进空间,目前只是能用
下载 https://a-new.lanzouu.com/b03cazu1ud密码:ak6v |