四个月作品:K12教育英语题库-献给广大读者

最近通过四个月的加工打磨,特别开发了一个生成标准化试题的试题库,拿出来和大家一起分享。

主要的功能思路,教材主体内容,语法功能列举,习题设置,练习考试,错题生成,知识点选题,句子翻译等等功能。

主目录

库结构

import sys
import io
import os
import re
import shutil
import datetime
import hashlib
import requests
import subprocess
from datetime import datetime
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx import Document

函数名称目录

def translate(text, app_id, app_key)
def english_knowledge()
def select_article_by_index(index)
def diplay_all_articles()
def move_file_to_folder(file_path, folder)
def hand_input_article()
def show_all_articles()
def get_resource()
def show_program_description()
def title_menu()
def select_article_by_index(indx, articles)
def search_articles(file_path, keyword, fu_keyword)
def save_errors_to_excel(file_path, tixing_match,threshold)
解析函数:find_duplicate_questions(json_data)

通过file_path采集本地硬盘保存的articles.json,通过函数Json.loads转化为可处理数据。

        loads功能:

                json.loads() 是 Python 标准库中的一个方法,用于将 JSON 格式的字符串解析为 Python 数据结构。它通常用于从 JSON 字符串中提取数据,并将其转换为 Python 中的字典、列表、数字、布尔值等类型。这个方法接受一个 JSON 字符串作为输入,并返回解析后的 Python 数据结构。

 loads示例:

import json  
  
# 假设有一个包含 JSON 数据的字符串  
json_string = '{"name": "John", "age": 30, "city": "New York"}'  
  
# 使用 json.loads() 方法解析 JSON 字符串  
data = json.loads(json_string)  
  
# 输出解析后的数据  
print(data)  # 输出:{'name': 'John', 'age': 30, 'city': 'New York'}
 解析1:函数参数引导
            file_path = 'articles.json'
            with open(file_path, 'r', encoding='utf-8') as file:
                # 读取文件内容
                data = file.read()
                # 将文件内容转换为Python对象
                json_data = json.loads(data)
            duplicates = find_duplicate_questions(json_data)
            print(duplicates)
            input('继续')
解析2:参数代码分析
    函数源码:
def find_duplicate_questions(json_data):
    questions_dict = {}
    duplicates = []

    for item in json_data:
        question_str = json.dumps(item, ensure_ascii=False)
        if question_str in questions_dict:
            duplicates.append(item)
        else:
            questions_dict[question_str] = item

    return duplicates

 代码解析:

代码解释:

  1. def find_duplicate_questions(json_data):

    • 定义一个函数find_duplicate_questions,它接受一个参数json_data
  2. questions_dict = {}

    • 初始化一个空字典questions_dict,用于存储已经出现过的question_str
  3. duplicates = []

    • 初始化一个空列表duplicates,用于存储重复的问题。
  4. for item in json_data:

    • 遍历json_data中的每一个元素,每个元素被称为item
  5. question_str = json.dumps(item, ensure_ascii=False)

    • item转换为JSON格式的字符串,并存储在question_str中。使用ensure_ascii=False来确保非ASCII字符被正确处理。
  6. if question_str in questions_dict:

    • 检查question_str是否已经在questions_dict中出现过。
  7. duplicates.append(item)

    • 如果question_str已经出现过,那么将当前的item添加到duplicates列表中。
  8. else:

    • 如果question_str没有出现过,执行以下操作:
  9. questions_dict[question_str] = item

    • 将当前的question_str和对应的item添加到questions_dict字典中。
  10. return duplicates

    • 返回包含所有重复问题的列表。

导图思维描述:

  1. 中心节点:函数名 find_duplicate_questions
  2. 子节点1:输入参数 json_data
  3. 子节点2:初始化 questions_dict
  4. 子节点3:初始化 duplicates
  5. 子节点4:遍历 json_data 中的每个元素。
  6. 子节点5:转换 item 为 question_str
  7. 子节点6:检查 question_str 是否在 questions_dict 中。
  8. 子节点7:将 item 添加到 duplicates 中(如果重复)。
  9. 子节点8:将 question_str 和 item 添加到 questions_dict 中(如果不重复)。
  10. 子节点9:返回 duplicates 列表。

解析函数 def search_keyword(keyword, json_path)

    keyword:是用户输入的关键词,json_path:是本地json文件的路径

该函数常常用来执行搜索后的展示内容,截图展示如下:

选择3查找单词练习真题标目时输入on,这里就调用了search_keyword()函数,

# 定义一个名为 search_keyword 的函数,它接受两个参数:keyword 和 json_path  
def search_keyword(keyword, json_path):  
    # 使用 open 函数打开 json_path 指定的文件,以读取模式,并且指定文件编码为 UTF-8  
    with open(json_path, "r", encoding="utf-8") as f:  
        # 使用 json.load 函数从文件中读取 JSON 数据,并将其转换为 Python 对象  
        data = json.load(f)  
  
        # 遍历 data 中的每个元素  
        for item in data:  
            # 检查 keyword 是否存在于 item 的值中  
            if keyword in item.values():  
                # 尝试从 item 中获取键为 "sentences" 的值,并将其赋值给 sentences  
                sentences = item.get("sentences")  
  
                # 检查 sentences 是否非空  
                if sentences:  
                    # 打印一条消息,指示正在查找的关键词是 keyword  
                    print(f"Examples of '{keyword}':")  
                    # 遍历 sentences 中的每个句子,并将其赋值给 sentence  
                    for sentence in sentences:  
                        # 打印每个句子  
                        print(f"- {sentence}")  
                    # 打印一个空行,使输出更整洁  
                    print()    
                else:  
                    # 如果没有找到与关键词匹配的句子,则打印一条消息  
                    print(f"No sentences found for '{keyword}'")    
                return  # 结束函数,不继续查找其他项目或输出。
解析函数def search_and_save_articles()
        search_and_save_articles核心功能

                1、通过搜索条件进行试题的筛选

                2、把选好的试题进行组卷word试题

                3、把选出的试题答案进行组卷,本函数相当于把word及答案同时生成,效果图如下就是生成的zhongkao.docx的试题及答案的内容。

 

         search_and_save_articles函数解析
def search_and_save_articles(file_path, keyword, fu_keywords, num_questions):
    # 读取试题和答案的json文件
    path_parts = file_path.split('\\')
    tixing_match = path_parts[-2]

    with open(file_path, "r", encoding="utf-8") as f:
        articles = json.load(f)

        # 保存试题到列表中
    questions = []
    answers_and_explanations = []

    for article in articles:
        if keyword.lower() in article['title'].lower() and fu_keywords in article['title'].lower():
            for sentence in article['sentences']:
                if len(questions) >= num_questions:
                    break  # 如果题目数量达到了指定数量,停止添加新题目
                questions.append(sentence['question'])
                answers_and_explanations.append((sentence['answer'], sentence['explain']))


                # 创建一个新的docx文档来保存试题
    doc_questions = Document()

    # 遍历试题列表,为每道题添加答案和解析
    for i, question in enumerate(questions):
        paragraph = doc_questions.add_paragraph()
        # 加粗文章标题
        run = paragraph.add_run(f"{i + 1}. {question}")
        run.font.name = '楷体'
        run.font.size = Pt(12)
        run.font.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')
        paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 设置段落对齐方式为左对齐

    # 保存试题docx文件
    filepath_questions = fr"C:\Users\123\PycharmProjects\pythonProject1\english\zhongkao\word试题栏\Q_{keyword}_{tixing_match}.docx"
    doc_questions.save(filepath_questions)

    # 创建一个新的docx文档来保存答案和解析
    doc_answers_explanations = Document()

    # 遍历答案和解析列表,为每个答案和解析添加到文档中
    for i, (answer, explanation) in enumerate(answers_and_explanations):
        paragraph = doc_answers_explanations.add_paragraph()
        run = paragraph.add_run(f"\n{i + 1}题答案:{answer}")
        run.font.name = '楷体'
        run.font.size = Pt(12)
        run.font.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')
        paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 设置段落对齐方式为左对齐
        run = paragraph.add_run(f"\n解析:{explanation}")
        run.font.name = '楷体'
        run.font.size = Pt(12)
        run.font.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')
        paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 设置段落对齐方式为左对齐

    # 保存答案和解析docx文件
    filepath_answers = fr"C:\Users\123\PycharmProjects\pythonProject1\english\zhongkao\word试题栏\A_{keyword}_{tixing_match}.docx"
    doc_answers_explanations.save(filepath_answers)

    # 使用系统默认的程序打开文件
    subprocess.run(["start", filepath_questions], shell=True)
    subprocess.run(["start", filepath_answers], shell=True)

def search_in_libraries(keyword, library_paths)

def print_menu()

功能目录

1. 获取资源      
2. 显示内容    
子目录1:范围选择
子目录2:标题选择
子目录3:内容搜索

内容搜索look after

功能截图

3. 查单词练真题

    查各种词性的单词,同时显示含有该词的句子。

查找in:

查找front:

4. 中高试题  
子目录1:练习中考和单招考试试题
子目录2:练习高考试题

模块截图:

生成试题图,可以实现一键根据选择知识点提取试题进行相关练习,现在两个文件(试题和答案)则是根据现在进行时态提取的练习题目(截图)。

 试题内部图

5. 错题重建    

错题本直接生成DOC功能,把做错的题目按照错误次数展示出来。

6.  按知识点练题    

JSON文件

本地json文件如下:

程序运行主界面:

一、主界面代码源码如下:

def print_menu():

    while True:


        print("\n\n***-------------·姜老师英语学习助手·------------***\n")
        print("""           \n\t1. 获取资源      2. 显示内容     3. 查单词练真题
                            \n\t4. 中高试题      5. 错题重建     6.  按知识点练题    
                            \n\t\t\t\t7. 文件内容重查询
                            
                            \n\t\t\t\t 退出 - [8]   
                                        \n***------------------退出程序------------------***""")
        choice = input("\n\n请输入选择的操作序号:")
        if choice == '1':
            article = get_resource()
            print("获取资源成功!")

        elif choice == '2':
            diplay_all_articles()
        elif choice == '3':
            while True:
                sear = input('输入查找的单词/退出exit\n:')
                if sear == 'exit':
                    break
                search_in_libraries(sear, library_paths)
        elif choice == '4':
            # 调用函数,输入关键字
            print('1 练习中考和单招考试试题        2 练习高考试题')
            cho = input('输入练习序号')
            if cho == '1':
                fu_keywords = 'zhongkao'
                second_words = input('输入查找/时态..词性..语法..单词')
                file = r"C:\Users\123\PycharmProjects\pythonProject1\english\zhongkao\zhongkao_choose_test.json"
                search_articles(file,second_words,fu_keywords)
            if cho == '2':

                file = r"C:\Users\123\PycharmProjects\pythonProject1\english\zhongkao\gaokao_choose_test.json"
                fu_keywords = 'gaokao'
                second_words = input('查找/时态..词性..语法..单词')
                search_articles(file,second_words,fu_keywords)


        elif choice == '5':
            print('''
                   1. 保存中考错题      2. 保存高考错题

            ''')
            cho = int(input('输入序号:'))
            if cho == 1:
                tixing_match = 'zhongkao'
                save_errors_to_excel(r'C:\Users\123\PycharmProjects\pythonProject1\english\zhongkao\zhongkao_choose_testzhongkao_choose_test.json',tixing_match, 0)
            elif cho == 2:
                tixing_match = 'gaokao'
                save_errors_to_excel(r'C:\Users\123\PycharmProjects\pythonProject1\english\zhongkao\gaokao_choose_testgaokao_choose_test.json',tixing_match, 0)

        elif choice == '6':
            print('1、随机选择中考试题   2、随机选择高考试题')
            cho = int(input('输入序号1/2选择中高考试题:\n'))
            if cho == 1:
                keyword = input('输入中考选题内容:如形容词,副词,动词不定式,一般现在时,现在进行时,现在完成时...等\n->')
                fu_keywords = 'zhongkao'
                file_path = r"C:\Users\123\PycharmProjects\pythonProject1\english\zhongkao\zhongkao_choose_test.json"
            elif cho == 2:
                keyword = input('输入高考选题内容:如形容词,副词,非谓语动词,现在分词,固定搭配...等\n->')
                fu_keywords = 'gaokao'
                file_path = r"C:\Users\123\PycharmProjects\pythonProject1\english\zhongkao\gaokao_choose_test.json"

            num_questions = int(input('输入选题数量:'))
            search_and_save_articles(file_path, keyword,fu_keywords, num_questions)

        elif choice == '7':
            #文件内容重查询
            file_path = 'articles.json'#input('输入文件查重文件路径\n:')
            with open(file_path, 'r', encoding='utf-8') as file:
                # 读取文件内容
                data = file.read()
                # 将文件内容转换为Python对象
                json_data = json.loads(data)
            duplicates = find_duplicate_questions(json_data)
            print(duplicates)
            input('继续')

        elif choice == '8':
                print("程序已退出。")
                break
        else:
            print("输入有误,请重新输入。")
(1)函数功能介绍:
print_menu()函数

        while True():是一个程序循环代码,让程序可以不断的循环。

        print()输出功能提示,这是一个输出的文字说明的函数

        if ...elif...:通过8个分支介绍了本程序的八个主要功能模块。

(2)运行函数 

              这里包括english_knowledge()函数,知识图谱函数

                print_menu()调用上面的功能函数

if __name__ == '__main__':
    english_knowledge()
    print_menu()

12.16日更01

12.21日更02

后续为大家继续分析内部代码结构,及相关用法,请收藏关注!!!谢谢大家,鞠躬!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值