用Python读取Word文件并提取标题

前言

在日常工作中,我们经常需要处理Word文档,特别是从中提取关键信息,如标题、段落等。今天,我们将利用Python来实现这一功能,并为大家提供一段完整的代码示例。

准备工作

首先,你需要安装python-docx库,这是一个用于处理Word文档的Python库和collections库,用于数据去重

。你可以使用以下命令安装它:

pip install python-docx collections

代码讲解

下面是实现该功能的完整代码:

#!/usr/bin/env python3
# coding:utf-8
import re
import docx
import os
from collections import OrderedDictinterfere = []
garde = []'''判断依据'''
first_title = []
first_title1 = []
first_title2 = []kew_word = ['是', '要']
one_characters = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '⑪', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳', '第', '甲', '乙', '丙', '—', 'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅴ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ', 'Ⅹ']
two_characters = []
three_characters = []
four_characters = []
five_characters = []
year = []
number1 = []
number2 = []
spell = []
spell1 = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '⑪', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳', 'Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅴ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ', 'Ⅹ']def main():creat_role()path = r'./test'  #  测试文件夹file_name = os.listdir(path)for i in file_name:file_path = path + '\\' + icontent = read_data(file_path)# print(content)title = get_title(content)get_second_title(title)garde_unique = list(OrderedDict.fromkeys(garde))for i in garde_unique:print(i)def read_data(filename):content = []doc = docx.Document(filename)for para in doc.paragraphs:for r in para.runs:if r.bold and 5 < len(r.text) < 50 and r.text[-1] != ',':content.append(r.text + 'label')else:content.append(para.text)return contentdef get_title(ls):title = []for i in ls:i = re.sub('\s', '', i)if len(i) == 0:continueelse:if i[:1] in one_characters or i[:2] in two_characters or i[:3] in three_characters or i[:4] in four_characters or i[:5] in five_characters or i[:-5] == 'label':title.append(i)return titledef get_second_title(ls):label = ['<first>', '<second>', '<third>', '<fourth>', '<fifth>']mark = []number = []for i in ls:if i[1] == '年' and i[3] != ',':continueelif str(i[:4]) in year:continueelif i[:2] == '一九' or i[:2] == '二零':continueelif i[:2] in first_title or i[:3] in first_title1 or i[:4] in first_title2:if '。' in i:garde.append(i.split('。')[0] + label[0])else:garde.append(i + label[0])mark = []else:if i[0] in interfere:mark.append('一')elif i[:1].isdecimal() == True:mark.append('壹')elif i[:2].isdecimal() == True:mark.append('壹')elif i[:1] in spell:mark.append('A')elif i[:1] in spell1:mark.append('①')else:mark.append((i[:1]))result = []s = len(set(mark))if s == 1:garde.append(i.split('。')[0] + label[1])elif s == 2:ls1 = two_word(mark, result)if i[:1] == ls1[0]:garde.append(i.split('。')[0] + label[1])else:garde.append(i.split('。')[0] + label[2])elif s == 3:ls1 = two_word(mark, result)if i[:1] == ls1[0]:garde.append(i.split('。')[0] + label[1])elif i[:1] == ls1[1]:garde.append(i.split('。')[0] + label[2])else:garde.append(i.split('。')[0] + label[3])elif s == 4:ls1 = two_word(mark, result)if i[:1] == ls1[0]:garde.append(i.split('。')[0] + label[1])elif i[:1] == ls1[1]:garde.append(i.split('。')[0] + label[2])elif i[:1] == ls1[2]:garde.append(i.split('。')[0] + label[3])else:garde.append(i.split('。')[0] + label[4])else:passdef two_word(ls, ls1):for j in ls:if j not in ls1:ls1.append(j)return ls1def three_word(ls, ls1):for j in ls:if j not in ls1:ls1.append(j)return ls1def four_word(ls, ls1):for j in ls:if j not in ls1:ls1.append(j)return ls1def creat_role():basic = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']'''添加中文序号'''for chin in basic:one_characters.append(chin)interfere.append(chin)first_title.append(chin + '、')three_characters.append(f'({chin})')three_characters.append(f'({chin})')for chin1 in basic[:-1]:two_characters.append(basic[-1] + chin1)first_title1.append(basic[-1] + chin1 + '、')four_characters.append(f'({basic[-1]}{chin1})')four_characters.append(f'({basic[-1]}{chin1})')for chin2 in basic[1:-1]:two_characters.append(chin2 + basic[-1])first_title1.append(chin2 + basic[-1] + '、')four_characters.append(f'({chin2}{basic[-1]})')for chin3 in basic[1:-1]:for chin4 in basic[:-1]:three_characters.append(chin3 + '十' + chin4)first_title2.append(chin3 + '十' + chin4 + '、')five_characters.append(f'({chin3}十{chin4})')five_characters.append(f'({chin3}十{chin4})')'''添加数字序号'''for num in range(1, 10):one_characters.append(str(num))three_characters.append(f'({str(num)})')three_characters.append((f'({str(num)})'))number1.append(num)for num in range(10, 100):two_characters.append(str(num))four_characters.append(f'({str(num)})')four_characters.append(f'({str(num)})')number2.append(num)'''添加英文序号'''for letter in range(97, 123):one_characters.append(chr(letter))three_characters.append(f'({chr(letter)})')three_characters.append(f'({chr(letter)})')spell.append(chr(letter))for letter1 in range(65, 91):one_characters.append(chr(letter1))three_characters.append(f'({chr(letter1)})')three_characters.append(f'({chr(letter1)})')spell.append(chr(letter1))'''添加年份'''for i in range(1951, 2101):year.append(str(i))if __name__ == '__main__':main()

代码解析

  1. 初始化判断依据:我们定义了许多列表来存储不同类型的序号和干扰字符,如one_characterstwo_characters等。这些列表用于后续判断哪些是标题。

  2. 读取文档内容read_data函数用于读取Word文档的内容,并将加粗的文本标记为标题候选。

  3. 提取标题get_title函数根据一定规则从读取的内容中提取出可能的标题。

  4. 分类标题get_second_title函数进一步细分标题的层级,并添加相应的标签(如<first><second>等)。

  5. 创建角色create_rolecreate函数初始化标题判断依据,包括中文、数字、英文序号等。

  6. 去重:OrderedDict函数将重复添加的标题去掉。

项目体验

你可以在我的Gitee仓库中找到完整的项目代码,并下载到本地进行体验。点击以下链接访问项目:

Gitee仓库地址

希望这个教程对你有所帮助,如果有任何问题,欢迎在评论区留言讨论。

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

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

相关文章

Web浏览器读写NFC Ntag标签

本示例使用的发卡器&#xff1a;RS232串口USB转COM读写器IC卡发卡器WEB浏览器二次开发JS编程SDK-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&g…

不锈钢氩弧焊丝ER316L

说明&#xff1a;TG316L 是超低碳的不锈钢焊丝。熔敷金属耐蚀、耐热、抗裂性能优良。防腐蚀性能良好。 用途:用于石油化工、化肥设备等。也可用于要求焊接后不进行热处理的高Cr钢的焊接。

真实评测:可道云teamOS文件上传功能丝滑到爱不释手

对于每日沉浸在图片与视频海洋中的媒体工作者而言&#xff0c;与海量的多媒体文件打交道几乎成了家常便饭。 文件的上传和存储&#xff0c;对他们而言&#xff0c;不仅仅是工作中的一个环节&#xff0c;更像是将一天的辛勤与付出妥善安置的仪式。无论是突发现场的精彩瞬间&am…

web学习笔记(七十一)

目录 1.vue2注册子组件 2. vue2组件传值父传子 3. vue2组件传值子传父 1.vue2注册子组件 vue2注册子组件和vue3不使用setup语法糖注册子组件是一样的&#xff0c;都需要通过components来注册子组件。 <template><div class"about"><h1>关于&l…

海报在线制作系统源码小程序

轻松设计&#xff0c;创意无限 一款基于ThinkPHPFastAdminUniApp开发的海报在线制作系统&#xff0c; 本系统不包含演示站中的素材模板资源。​ 一、引言&#xff1a;设计新纪元&#xff0c;在线海报制作引领潮流 在数字时代&#xff0c;海报已成为传播信息、展示创意的重要媒…

配音软件哪个好用?推荐5款智能配音软件

随着期末考来袭&#xff0c;校园里的空气似乎都凝固了&#xff0c;每个角落都充满了紧张的气氛。 然而&#xff0c;在这紧张的氛围中&#xff0c;有一群学生却显得格外从容&#xff0c;因为他们掌握了一种秘密武器——配音软件。这些软件就像是他们的个人学习助理&#xff0c;…

git 中有关 old mode 100644、new mode 10075的问题解决小结

问题&#xff1a; 同一个文件被修改后&#xff0c;最后代码没有变&#xff0c;文件变了&#xff0c;导致提交了一个空文件 git diff 提示 filemode 发生改变&#xff08;old mode 100644、new mode 10075&#xff09; 解决办法 &#xff1a; 原来是 filemode 的变化&#xff…

虚拟机字节码执行引擎之运行时栈帧结构

概述 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定…

Request流只能读取一次的问题

SpringBoot 接口加密解密&#xff0c;新姿势&#xff01;_spring boot 请求加解密-CSDN博客 2.2 request流只能读取一次的问题2.2.1 问题&#xff1a; 在接口调用链中&#xff0c;request的请求流只能调用一次&#xff0c;处理之后&#xff0c;如果之后还需要用到请求流获取数…

彩虹PLM系统:引领汽车行业的数字化转型

彩虹PLM系统&#xff1a;引领汽车行业的数字化转型 彩虹PLM系统作为汽车行业数字化转型的引领者&#xff0c;凭借其卓越的技术实力和丰富的行业经验&#xff0c;为汽车行业带来了全面的解决方案。以下是彩虹PLM系统如何引领汽车行业数字化转型的详细分析&#xff1a; 一、整合全…

约课健身管理系统小程序源码

健身达人的智能助手 一款基于FastAdminThinkPHPUniapp开发的米扬约课健身管理系统&#xff0c;应用于健身房&#xff0c;健身工作室&#xff0c;运动会所&#xff0c;运动场馆&#xff0c;瑜伽馆&#xff0c;拳馆等泛健身行业的场馆中。米扬约课健身致力于为各种健身场馆打造真…

Verilog刷题笔记49——Fsm1同步复位

题目&#xff1a; 解题&#xff1a; module top_module(clk,reset,in,out);input clk;input reset;input in;output out;parameter A0,B1;reg [1:0]current_state,next_state;always(posedge clk)beginif(reset)current_stateB;elsecurrent_statenext_state;endalways(*)beg…

手机图片怎么上传到电脑记事本 保姆级教程

在这个数字化时代&#xff0c;手机成了我们随身携带的摄影棚。无论是旅途中的美景&#xff0c;还是与朋友欢聚的瞬间&#xff0c;手机总能轻松捕捉。然而&#xff0c;手机存储空间有限&#xff0c;那些珍贵的照片和视频&#xff0c;怎样才能安全又方便地保存下来&#xff0c;供…

PFA量杯:精确、实用、高颜值的量杯选择!

您是否在烹饪、实验室实验或日常使用中需要一个精确、实用且高颜值的量杯&#xff1f;PFA量杯是您最佳的选择&#xff01; PFA量杯采用高品质材料制成&#xff0c;具有良好的耐腐蚀性、耐高温性&#xff0c;使用寿命长。透明度极高的杯身&#xff0c;使您在使用时能够清晰地看…

Python项目开发实战:小海龟挑战大迷宫游戏,案例教程编程实例课程详解

一、项目背景与意义 在Python编程学习中,项目实战是检验学习成果、提升编程能力的重要途径。本次项目实战将围绕“小海龟挑战大迷宫”游戏展开,旨在通过构建一个有趣的迷宫游戏,加深对Python语言、海龟图形库(turtle)以及算法逻辑的理解。该项目不仅具有教育意义,还能培养…

自动化脚本存到数据库中有用吗?

一般情况下, 没用! 存到数据库中, 本质上是一种, 代码文件的保存管理, 目的是为了传递和相关的版本管理. 比起这个还得是用git仓库这套要方面, 理由, 有配套的工具和方法论, 有优秀的交流社区, 版本管理和安全的约束也都能够满足. 如果存到数据库中, 则需要自行定义各种使用规…

LLM在软件测试中的革新应用

一、引言 随着人工智能技术的蓬勃发展&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;简称LLM&#xff09;如GPT系列&#xff0c;在自然语言处理领域取得了显著进展。LLM不仅能够处理复杂的自然语言任务&#xff0c;还在多个领域展现出广泛的应用潜力。在…

深圳网页设计收费情况

深圳是中国最具活力和发展速度最快的城市之一&#xff0c;随着经济的快速发展&#xff0c;各种行业都飞速发展&#xff0c;尤其是互联网行业。网页设计是互联网行业的重要组成部分&#xff0c;深圳的网页设计师数量也是非常庞大的。那么&#xff0c;深圳网页设计师的收费情况是…

MySQL之可扩展性(五)

可扩展性 向外扩展 7.在节点上部署分片 需要确定如何在节点上部署数据分片。以下是一些常用的办法: 1.每个分片使用单一数据库&#xff0c;并且数据库名要相同。典型的应用场景是需要为每个分片都能镜像到原应用的结构。这在部署多个应用实例&#xff0c;并且每个实例对应一…

【Linux学习十八】网站管理:防火墙介绍、静态站点、动态站点、域名

1.Apache Apache官网: www.apache.org 软件包名称: httpd 服务端口:80/tcp(http) 443/tcp(https) 配置文件: /etc/httpd/conf/httpd.conf 子配置文件:/etc/httpd/conf.d/*.conf 查看被占用的端口号 netstat -tuln | grep <端口号> 解哪个程序正在使用端口 80&#xff0…