python把Word题库转成Excle题库

news2025/1/18 11:53:17

又到了一年一度的背题时刻,但是收到的题库是Word版的,页数特别多

话不多说,上代码,有图有真相,代码里面备注的很详细

# 导入所需库
import csv
import os
import re
 
from docx import Document
from win32com import client as wc
 
 
# 打开word文档
 
 
def doc_to_docx(doc_file):
    full_path = os.path.abspath(doc_file)  # 绝对路径,便于分离文件位置、名和后缀
    word = wc.Dispatch("Word.Application")
    doc = word.Documents.Open(full_path)
    doc.SaveAs(os.path.splitext(full_path)[0] + '.docx', 12)  # 保存只改后缀 12 为docx
    doc.Close()
    word.Quit()
    return os.path.splitext(full_path)[0] + '.docx'
 
 
def save_to_csv(doc_name, date):  # date为list [[1],[2],[3]...]
    name = os.path.abspath(doc_name)
    # os.path.splitext(name)[0]
    out = open(f'{os.path.splitext(name)[0]}.csv', 'a', encoding='utf-8', newline='')
    csv_write = csv.writer(out, dialect='excel')
    for row in date:
        csv_write.writerow(row)
    out.close()
    print(f'文件{os.path.splitext(name)[0]}.csv生成完毕!请查看')
 
 
if __name__ == '__main__':
    """
    为防止格式错乱,请先在源文件里执行将^l替换为^p操作
    默认每个题目开头序号都是数字,如果不是,需要修改question_start_num对应的re代码
    """
    file_name = input("请输入word文件名(带后缀):")  # "2.doc"
    TG_style = '一二三四五六七八九、'  # 大题干类型(最后一位为符号)
    choose_split = "、"  # 选项分割符号A、 A.
    if file_name.endswith('.doc'):  # 加快处理速度:.docx比doc处理速度快,所以如果不是x结尾的转成x的
        file_name = doc_to_docx(file_name)
    document = Document(file_name)
    # 获取所有段落
    all_paragraphs = document.paragraphs
    start_num = 0  # 主干序号下角序号
    TX = ''  # 题型
    All_content = []  # 存储所有题内容
    tem = []  # 临时存储每个题类型、题干、选项、答案
    for paragraph in all_paragraphs:
        # 打印每一个段落的文字
        # print([paragraph.text])
        tittle_split = '、'
        question_start_num = re.compile(f'^\d')  # 识别题干头是否是数字
        p = re.compile(f'^{TG_style[start_num] + TG_style[-1]}')  # 匹配开头字符,筛选出大标号,区分题目类型
        tittle_ret = question_start_num.search(paragraph.text)  # 识别题干头
        ret = p.search(paragraph.text)  # 识别题型
        if ret:
            TX = paragraph.text.replace((TG_style[start_num] + TG_style[-1]), '', 1)
            start_num += 1
            # tittle_num = 1
            # print(TG)
            All_content.append(tem)
            tem = []
            All_content.append([paragraph.text])  # 读完题型,说明进入了题目内容
        else:
            if tittle_ret:  # 是否是题干
                All_content.append(tem)  # 如果是题干,证明上一题遍历完毕,进行缓存
                tem = [TX]  # 保存题型在第一位
                # print(f"{TG}{paragraph.text}")
                # tittle_num += 1  # 遇到题号不连续时继续处
            if All_content:  # 不是题干,缓存写了,说明在读取选项
                '''
                此处为了区分一行有多个选项的情况,逐个读取出来
                '''
                chooses = re.split(f"[A-Za-z]{choose_split}", paragraph.text)
                for choose in chooses:
                    if choose.replace(' ', ''):  # 替换掉选项中空格进行过滤
                        #print(choose)
                        tem.append(choose)
    save_to_csv(file_name, All_content)

题库已打包,有环境的直接RUN,有问题可以咨询(不保证一定解决)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1171991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】数组和字符串(十四):字符串匹配1:朴素的模式匹配算法(StringMatching)

文章目录 4.3 字符串4.3.1 字符串的定义与存储4.3.2 字符串的基本操作4.3.3 模式匹配算法1. 算法原理2. ADL语言3. 伪代码4. C语言实现5 时间复杂度 4.3 字符串 字符串(String)是由零个或多个字符(char)顺序排列组成的有限序列,简称为串。例如 “good morning”就是…

共焦显微镜使用

x.1 细胞培养 x.2 样品制备 以细菌为例,我们使用荧光染色细菌,静置15分钟。 15分钟后我们使用实验室的专用培养皿,选择吸收100uL的溶液滴在在培养皿中心。 x.3 显微镜使用 我们按照1, 2, 3, 4的顺序打开显微镜, 打开电脑&…

降级python

起因: python版本过高不能下载一个包,需要降级 首先使用 python --version 查看python版本 然后conda install python3.10 python3.10会下载到这个目录下(这个千万别找错) 然后更换路径 alias python/home/zky/.conda/envs/c…

【MAC+IP】以太网帧格式

图片出自:https://info.support.huawei.com/info-finder/encyclopedia/zh/MTU.html

FFmpeg 硬件加速视频转码指南

基于 Windows 下演示,Linux 下也可以适用。 所使用 ffmpeg 版本为 BtbN 编译的 win64-gpl 版(非 gpl-share),项目地址:BtbN / FFmpeg-Builds 也可以使用 gyan.dev 编译的 git-full 版,地址:gyan…

053基于web+springboot的宠物咖啡馆平台的设计与实现

欢迎大家关注,一起好好学习,天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本基于Spring Boot的宠物咖啡馆平台的设计与实现有管理员和用户以及看护师三个角色。用户功能有个人中心,咖啡菜品管理&a…

微信视频号直播间引流粉丝脚本软件实操教学,文章加视频演示详细教学方法

我是小刘,第一我要讲的是为什么要做视频号? 今天我们来去演示的是视频号直播间引流脚本的一个教学,我这边用文章加视频讲解的方法来分享给大家。关于引流有两点,1 就是自媒体推广,2就是脚本引流,我今天给大…

定时任务场景下的代码审查:continue和return的滥用可能引发潜在bug

文章目录 前言for 循环中的continue,break和return实际业务中的滥用总结写在最后 前言 在最近的代码审查中,有帮忙审查了组里一个刚毕业1年不到的应届生,发现他写的其中一段代码将for循环中的break、continue、return滥用,导致了…

口碑超好高质量经典小说,收获无数赞誉,完结多年还是热门之作

经典好文,小郑来为您推荐五本值得一读的好书,这些书籍不仅可以让您的时间不再无聊,还能让您在阅读中获得更多的知识和乐趣。 《传说管理局》 这本书的世界观严谨且庞大,充满了科幻和玄幻元素。如果您喜欢科幻和玄幻类型的书籍&am…

力扣:149. 直线上最多的点数(Python3)

题目: 给你一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱…

记一次heapdump泄漏获取服务器权限

文章目录 一、漏洞原因二、漏洞利用三、漏洞进一步利用1、工具下载2、通过关键字查询3、通过配置redis的默认账号和密码进行登录4、添加定时计划任务,进行反弹shell5、成功获取服务器的shell补充四、总结五、免责声明一、漏洞原因 扫描目录发现某个spring框架存在大量泄露信息…

DBeaver关闭代码的提示

在DBeaver中会遇到如下现象,很烦,怎么取消这个提示框呢? 解决方案:

第二章 02Java基础-数据类型、标识符、键盘录入

文章目录 前言一、数据类型二、标识符三、键盘录入总结前言 今天我们学习Java基础,数据类型、标识符、键盘录入 一、数据类型 1.数据类型大体上可以分为两类,一类是基本数据类型,另外一类是引用数据类型。今天我们学习基本数据类型。 2.基本数据类型可以分为四类八种,整…

一看就懂,原来这就是计算机网络

引言 计算机网络,听上去很专业的样子,其实我们可以换种思维来理解。 正文 什么是计算机网络? 下图就是计算机网络,所有能联网的设备连接在一起就组成了互联网 计算机网络有什么用? 计算机网络的作用就是用于设备之…

VueX mapState、mapGetters、mapActions和mapMutaions 的使用

一、mapState和mapGetters 如果我们想要读取VueX中的State数据的Getters数据时,需要使用$store.state.数据名 和 $store.getters.数据名。 当我们State和getters中的数据多了以后,书写会很麻烦: 如果我们想要使用方便可以配置计算属性来简化…

Arduino设置SoftwareSerial缓冲区大小

SoftwareSerial的缓冲区大小设置 概述修改缓冲区的大小实验 概述 新的Arduino的ESP8266软串口的缓冲区原来老的库中有宏定义可以用来修改接收和发送缓冲区的大小。在现在新的库中已经没有这个设置了,那怎么才能修改缓冲区的大小哪? 修改缓冲区的大小 …

5.2用队列实现栈(LC225-E)

算法: 其实这道题不用像上一道题一样,用两个队列实现栈。 由于队列的数据结构特性。用一个队列就可实现栈。 难点还是在出队的时候: 比如队列[1,2,3],要模拟一个栈入栈就是直接append(其实就是C中的push&#xff0…

creating server tcp listening socket 127.0.0.1:6379: bind No error

window下启动redis服务报错: creating server tcp listening socket 127.0.0.1:6379: bind No error 解决方案如下按顺序输入如下命令即可连接成功 redis-cli.exeshutdownexit运行:redis-server.exe redis.windows.conf shutdown出现以下错误&#xff…

数据结构之队的实现

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…

变压器那些事

电磁感应 电磁感应效应是指当一个导体或线圈处于变化的磁场中时,会在导体或线圈中产生感应电动势或感应电流的现象。 根据法拉第电磁感应定律,当一个导体或线圈被置于变化的磁场中时,通过该导体或线圈的磁通量会发生变化,从而在…