当前位置 博文首页 > 吴斌的博客:马原刷题工具

    吴斌的博客:马原刷题工具

    作者:[db:作者] 时间:2021-06-28 09:15

    要安装的库:pywin32, python-docx
    选择题库文件word后,就能开始刷题了。
    导入题库时会自动生成一个docx文件和json文件,想要重新导入就删除json文件。

    """
    @author: Bre Athy
    @contact: https://www.zhihu.com/people/you-yi-shi-de-hu-xi
    @productware: PyCharm
    @file: 刷题.py
    @time: 2020/1/1 22:28
    """
    # 要安装的库:pywin32, python-docx
    from docx import Document
    from win32com.client import Dispatch as DPT
    import os, re, json, copy, random
    
    def main():
        print("导入题库前请先关闭word!")
        wordpath = input("请输入题库word文档的位置:")
        if os.path.exists(os.path.splitext(wordpath)[0]+".json"):
            with open(os.path.splitext(wordpath)[0] + ".json", "r") as fp:
                Qs = json.load(fp)
        else:
            if os.path.splitext(wordpath)[1] == ".doc":
                print("检测到文件格式为doc,正在转为docx")
                word = DPT("Word.Application")
                doc = word.Documents.Open(wordpath)
                wordpath += "x"
                doc.SaveAs(wordpath, 12)
                doc.Close()
                word.Quit()
                print("转格式成功,文件存储为",wordpath)
    
            word = Document(wordpath)
            i = 1
            Qs = []
            Q = {}
            mcq = False
            if input("是否导入多选题(Y/N)?").upper() == "y":mcq = True
            for par in word.paragraphs:
    
                # 处理answer的函数,添加到列表中
                def parseresult(regex, content, item, over = False, answer = False):
                    result = re.match(regex, content)
                    if result:
                        Q[item] = result.group(1).strip()
                        if answer:
                            if len(Q[item])>1 and mcq:
                                Qs.append(copy.deepcopy(Q))
                                Q.clear()
                        if over:
                            Qs.append(copy.deepcopy(Q))
                            # print(Q)
                            Q.clear()
    
                if par.paragraph_format.alignment == 1:
                    if "多选题" not in par.text:
                        print("导入"+par.text)
                    i = 1
                else:
                    result = re.match(".*?(\d+)"+r"[\..]"+"(.*)",par.text)
                    if result:
                        Q={
                            "Item": result.group(1),
                            "Question" : result.group(2)
                        }
                        i += 1
                    parseresult(".*\(A\)(.*)", par.text, "A")
                    parseresult(".*\(B\)(.*)", par.text, "B")
                    parseresult(".*\(C\)(.*)", par.text, "C")
                    parseresult(".*\(D\)(.*)", par.text, "D")
                    parseresult(".*\(B\)(.*)", par.text, "B")
                    parseresult(".*\(A\)(.*)\(B", par.text, "A")
                    parseresult(".*\(B\)(.*)\(C", par.text, "B")
                    parseresult(".*\(C\)(.*)\(D", par.text, "C")
                    parseresult(".*A\.(.*)", par.text, "A")
                    parseresult(".*B\.(.*)", par.text, "B")
                    parseresult(".*C\.(.*)", par.text, "C")
                    parseresult(".*D\.(.*)", par.text, "D")
                    parseresult(".*A\.(.*?)B\.", par.text, "A")
                    parseresult(".*B\.(.*?)C\.", par.text, "B")
                    parseresult(".*C\.(.*?)D\.", par.text, "C")
                    parseresult("答.*?[::].*?(\w+).*", par.text, "Answer", answer=True)
                    parseresult("答.*?[::].*?(\w+).*知", par.text, "Answer", answer=True)
                    parseresult(".*?知.*:(.*)", par.text, "knowledge", over=True)
            with open(os.path.splitext(wordpath)[0] + ".json", "w") as fp:
                json.dump(Qs, fp)
        print("题库导入完成!")
        result = input("1、随机出题\n2、顺序出题\n请选择:")
        print("******************** 按下回车进入下一题 ********************")
    
        # 取出一道题
        def getQ(Q):
            input()
    
            def pprint(des, item):
                if item in Q.keys():
                    print(des, Q[item])
    
    
            if len(Q["Answer"]) == 1:
                if ("A" in Q["Answer"]) or ("B" in Q["Answer"]) or ("C" in Q["Answer"]) or ("D" in Q["Answer"]):
                    print("******************** 单选题 ********************")
                else:
                    print("******************** 判断题 ********************")
            else:
                print("******************** 多选题 ********************")
    
            if "Item" not in Q.keys():
                return None
            print(str(Q["Item"]) + ". " + Q["Question"])
            pprint("A.", "A")
            pprint("B.", "B")
            pprint("C.", "C")
            pprint("D.", "D")
    
            if input("请选择:").upper() == Q["Answer"]:
                print("正确!")
            else:
                pprint("错误!正确答案:", "Answer")
            pprint("知识点:", "knowledge")
    
    
        if result == "2":
            for Q in Qs:
                getQ(Q)
        elif result == "1":
            while True:
                getQ(random.choice(Qs))
        else:
            print("未选择,自动退出!")
    
    
    
    if __name__ == "__main__":
        main()
    
    

    第一次导入比较慢,第二次就打开就很快了了:
    在这里插入图片描述
    在这里插入图片描述