讲师中心 微信公众号
AI工具推荐 视频效率加速

如何修复 Python 项目中“无法显示统计信息”的问题

夏敏大大_3818

夏敏大大_3818

发布时间:2026-09-09 10:02:29

|

574人浏览过

|

来源于php中文网

原创

如何修复 Python 项目中“无法显示统计信息”的问题

本文详解为何 view_statistics() 总提示“No questions available”,并系统性修复 CSV 读写逻辑、类属性初始化、ID 分配及类型字段缺失等核心缺陷,确保统计功能正确加载已保存题目。

本文详解为何 `view_statistics()` 总提示“no questions available”,并系统性修复 csv 读写逻辑、类属性初始化、id 分配及类型字段缺失等核心缺陷,确保统计功能正确加载已保存题目。

在构建交互式学习工具时,view_statistics() 函数始终输出 “No questions available”,表面看是数据为空,实则根源在于数据持久化与反序列化流程存在多处关键断裂。以下为完整修复方案:

? 核心问题诊断与修复

✅ 1. questions.csv 未被正确写入或读取

save_questions() 使用 question.__dict__.copy() 导出字段,但 QuizFreeform 实例缺少 idtype 等关键属性(如 id__init__ 中未初始化),导致 CSV 写入缺失必要列;而 load_questions() 又依赖这些字段解析,形成死循环。

修复方式:统一初始化所有字段,并显式声明 idtype

# 修改 questions.py
class Question:
    def __init__(self, question, answer, enabled=True, times_shown=0, correct_count=0):
        self.question = question
        self.answer = answer
        self.enabled = enabled
        self.times_shown = times_shown
        self.correct_count = correct_count
        self.id = None          # 显式初始化,避免 __dict__ 缺失
        self.type = None        # 同上,供 save/load 识别类型

class Quiz(Question):
    def __init__(self, question, choices, correct_answer, enabled=True, times_shown=0, correct_count=0):
        super().__init__(question, correct_answer, enabled, times_shown, correct_count)
        self.choices = choices
        self.type = 'quiz'      # 强制设 type,避免 None

class Freeform(Question):
    def __init__(self, question, answer, enabled=True, times_shown=0, correct_count=0):
        super().__init__(question, answer, enabled, times_shown, correct_count)
        self.type = 'freeform'

✅ 2. save_questions() 字段不匹配 load_questions() 解析逻辑

csv.DictWriterfieldnames 缺少 id,且 choices 存储为字符串(', '.join(...)),但 load_questions() 直接用 row['choices'].split(', ') 解析——若原始 choice 含空格或逗号,将解析错误。

立即学习Python免费学习笔记(深入)”;

修复方式:使用 JSON 序列化 choices,并补全 id 字段

python全能编程助手
python全能编程助手

SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、

下载
import json

def save_questions(questions, file_name="questions.csv"):
    with open(file_name, "w", newline='', encoding='utf-8') as file:
        # 补全 id 字段 & choices 改用 JSON 安全序列化
        fieldnames = ["id", "question", "type", "choices", "answer", "enabled", "times_shown", "correct_count"]
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        for i, q in enumerate(questions, 1):
            row = q.__dict__.copy()
            row['id'] = i  # 动态分配 ID(或从 q.id 读取,需确保 q.id 已赋值)
            if isinstance(q, Quiz):
                row['choices'] = json.dumps(q.choices, ensure_ascii=False)
            else:
                row['choices'] = ""
            writer.writerow(row)

✅ 3. load_questions() 解析逻辑健壮性不足

原代码未处理 id 字段缺失、choices JSON 解析异常、answer 类型混淆(Quiz 的 answer 是 int 索引,Freeform 是 str)等问题。

修复方式:增强容错 + 正确还原对象结构

def load_questions(file_name="questions.csv"):
    if not os.path.exists(file_name):
        print("No questions found. The file does not exist.")
        return []

    questions = []
    try:
        with open(file_name, encoding='utf-8') as file:
            reader = csv.DictReader(file)
            for row in reader:
                try:
                    # 安全解析基础字段
                    q_id = int(row.get('id', 0))
                    q_type = row.get('type', '').strip()
                    question_text = row.get('question', '').strip()
                    answer_raw = row.get('answer', '')
                    enabled = row.get('enabled', 'True').lower() == 'true'
                    times_shown = int(row.get('times_shown', 0))
                    correct_count = int(row.get('correct_count', 0))

                    if not question_text:
                        continue

                    if q_type == 'quiz':
                        try:
                            choices = json.loads(row.get('choices', '[]'))
                            # answer 应为整数索引(原保存时是 int)
                            correct_idx = int(answer_raw) if answer_raw.isdigit() else 0
                            q = Quiz(question_text, choices, correct_idx, enabled, times_shown, correct_count)
                            q.id = q_id
                            questions.append(q)
                        except (json.JSONDecodeError, ValueError) as e:
                            print(Fore.YELLOW + f"Skip invalid quiz row {q_id}: {e}" + Style.RESET_ALL)
                            continue
                    elif q_type == 'freeform':
                        q = Freeform(question_text, answer_raw, enabled, times_shown, correct_count)
                        q.id = q_id
                        questions.append(q)
                except Exception as e:
                    print(Fore.RED + f"Error loading question {row.get('id', 'unknown')}: {e}" + Style.RESET_ALL)
                    continue
    except Exception as e:
        print(Fore.RED + f"Failed to read {file_name}: {e}" + Style.RESET_ALL)

    return questions

✅ 4. view_statistics() 中的计算与显示错误

原代码中 Correct Percentage 计算错误(误用 question.correct_count % 而非百分比公式),且未校验 times_shown > 0 导致除零风险。

修复方式:修正公式 + 增加安全判断

def view_statistics(questions):
    if not questions:
        print(Fore.RED + "No questions available" + Style.RESET_ALL)
        return

    print("Question Statistics:")
    print("===============================================")
    for question in questions:
        # ✅ 修复百分比计算:correct_count / times_shown * 100,且 times_shown > 0
        correct_percentage = (
            (question.correct_count / question.times_shown * 100) 
            if question.times_shown > 0 else 0.0
        )
        status = Fore.GREEN + "Enabled" + Style.RESET_ALL if question.enabled else Fore.RED + "Disabled" + Style.RESET_ALL

        print(f"ID: {question.id} | Status: {status}")
        print(f"Type: {question.type}")
        print(f"Question: {question.question}")
        print(f"Times Shown: {question.times_shown}")
        print(f"Correct Count: {question.correct_count}")
        print(f"Correct Percentage: {correct_percentage:.1f}%")
        print("===============================================")

⚠️ 关键注意事项

  • 文件路径一致性:确保 questions.csv 与主脚本在同一目录,或使用 os.path.join(os.path.dirname(__file__), "questions.csv") 构建绝对路径。
  • 首次运行需先添加题目view_statistics() 依赖 load_questions(),而后者只读取已有 CSV —— 必须先执行 (a) Adding questions 并成功保存后,再选 (b) 才能显示数据。
  • 调试建议:在 save_questions() 后添加 print(f"Saved {len(questions)} questions to {file_name}");在 load_questions() 开头打印 os.path.abspath(file_name) 验证路径。

完成以上修改后,添加题目 → 保存 → 切换至统计模式,即可稳定显示结构化统计数据。核心原则是:写入字段必须与读取逻辑严格对齐,对象属性必须全程显式初始化,关键数值运算必须防御性校验。

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1551

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

3624

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1549

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

20717

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2567

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2627

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1063

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.08.10

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

0

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn