• 怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel)


    怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel)

    本代码偏向处理高校教务处的工作

    休学或请假模板如下:

                                             休学证明(此联存教务办)
                                                编号:休202323
    计算机系23级计算机科学与技术本科专业学生5-StarrySky,不男不女,因自身原因,从2023年9月至2027年9
    月休学。复学时持复学申请和休学证明及休学期间所在单位开具的无违法乱纪行为证明办理复学手续。复学
    后编入2027级同专业就读。若逾期两周不办理复学手续,将做自动退学处理。
                                              CSDN大学教务办
    2023年11月12日
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    需求说明:

    1.首先从excel中取出需要休学的姓名
    2.然后利用得到姓名去word文件进行匹配
    3.最后通过观察发现,休学原因,在'因'和','之间,所以我们这样去取我们想要的数据
    
    • 1
    • 2
    • 3

    代码如下:

    		import re
        	# 从表格文件中提取姓名数据
            table_data = pd.read_excel("休学名单.xls")
            # names = table_data["XM"]
    
    
            # 从表格文件中提取姓名数据
            names = table_data["XM"]
    
            # 提取 Word 文档中的文本
            text = docx2txt.process("休学证明.docx")
    
            # 创建一个字典来存储姓名和对应的请假原因
            name_reason_dict = {}
    
            for name in names:
                found = False
                reason = None
                # 在提取的文本中搜索姓名
                if name in text:
                    # 查找姓名出现的最后一次位置
                    name_position = max([m.start() for m in re.finditer(name, text)])
                    # 查找 "因" 和截取到 "," 之前的文本
                    match = re.search(r'因(.*?),', text[name_position:])
                    if match:
                        reason = match.group(1)
                        found = True
                if found:
                    # 使用姓名作为键,保存最后一个匹配到的原因
                    name_reason_dict[name] = reason
    
            # 打印姓名和对应的请假原因
            for name, reason in name_reason_dict.items():
                print(f"姓名: {name}, 请假原因: {reason}")
            df = DataFrame(list(name_reason_dict.items()), columns=['XM', 'XXYY'])
            df.to_excel("休学证明.xlsx")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    重要知识点补充

    docx2txt:
    将docx文件转换为txt格式的模块
    能够直接读取docx文档并将其中的文本部分剥离出来的简单工具
    
    re.finditer:
    和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
    参数	描述
    pattern	匹配的正则表达式
    string	要匹配的字符串。
    flags	标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
    * 字符匹配
    实例	描述
    python	匹配 "python" 参考网址:https://www.runoob.com/python/python-reg-expressions.html
    
    max([m.start() for m in re.finditer(name, text)])
    这行代码是使用 Python 的正则表达式模块(re)来在文本字符串 text 中查找所有匹配 name 的位置,并返回其中最
    大的位置。
    具体解释如下:
    re.finditer(name, text):这部分使用 re.finditer() 函数来查找在 text 中所有匹配 name 的位置。finditer() 返回一个迭
    代器,迭代器的每个元素是一个包含匹配的相关信息的 Match 对象。
    [m.start() for m in ...]:这部分是一个列表推导式,它遍历 re.finditer() 返回的 Match 对象列表,对于每个 Match 对
    象 m,取其匹配的开始位置 m.start()。
    max([...]):最后,max() 函数用来从位置列表中找到最大的位置。
    
    match = re.search(r'因(.*?),', text[name_position:])
    这行代码使用正则表达式来搜索文本中以指定字符串 "因" 开头并以逗号 "," 结尾的文本段。
    具体解释如下:
    re.search(pattern, text):这部分使用 re.search() 函数来在文本字符串 text 中搜索与正则表达式 pattern 匹配的部
    分。pattern 是正则表达式模式,text 是要搜索的文本。
    r'因(.*?),':这是正则表达式模式。它的含义是:
    因:匹配字面字符串 "因"。
    (.*?):这是一个非贪婪捕获组,它会匹配任意字符(.)零次或多次(*),使匹配最短(非贪婪)。
    ,:匹配字面字符串 ","。
    text[name_position:]:这部分是对 text 字符串的切片操作,从 name_position 位置开始提取子字符串。
    
    list(name_reason_dict.items()): 这部分将字典 name_reason_dict 中的键值对转换为一个列表,其中每个元素是一个
    元组,元组的第一个元素是姓名 'XM',第二个元素是请假原因 'XXYY'。这个列表看起来像下面这样
    [('姓名1', '请假原因1'), ('姓名2', '请假原因2'), ('姓名3', '请假原因3'), ...]
    columns=['XM', 'XXYY']: 这是在创建 DataFrame 时指定的列名。DataFrame 的第一列将命名为 'XM',第二列将命
    名为 'XXYY',这与字典中的键对应。所以,在 DataFrame 中,第一列将包含姓名,第二列将包含请假原因。
    
    match 是一个 Python 正则表达式匹配对象,它包含了与正则表达式匹配的文本的详细信息。
    reason = match.group(1):用于从正则表达式匹配中获取文本中的具体部分。在这个特定的情况下,match 对象表
    示一个成功的正则表达式匹配,group(1) 用于提取匹配中的第一个捕获组(通常由括号包围的部分)。在你的情况
    下,正则表达式是 '因(.*?),',其中 (.*?) 表示一个捕获组,它将匹配 "因" 和 "," 之间的任何文本。
    参考链接:https://blog.csdn.net/m0_37360684/article/details/84140403
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    redis-读写分离-一台linux上模拟多台redis
    unity3d 卡死原因
    网管实战⑼:配置华为S5720交换机
    Arduino驱动CMPS12电子罗盘(惯性测量传感器篇)
    2023品牌新媒体矩阵营销洞察报告:流量内卷下,如何寻找增长新引擎?
    传统直线检测算法与基于深度学习的直线检测算法
    yolov5部署到android studio
    flutter 抓包工具charles
    17届智能车-多车编队寻光测距
    软件测试/测试开发丨Python安装指南(macOS)
  • 原文地址:https://blog.csdn.net/qq_37431461/article/details/134085569