Python 自动化之处理docx文件(一)

批量筛选docx文档中关键词


文章目录

  • 批量筛选docx文档中关键词
  • 前言
  • 一、做成什么样子
  • 二、基本架构
  • 三、前期输入模块
    • 1.引入库
    • 2.路径输入
    • 3.关键词输入
  • 三、数据处理模块
    • 1.基本架构
    • 2.如果是docx文档
      • 2.1.读取当前文档内容
      • 2.2.遍历匹配关键字
      • 2.3.触发匹配并记录日志
    • 3.如果目录下还有一个目录
      • 3.1.判断并生成新目录
      • 3.2.获取子目录里的东西并遍历它
      • 3.3.接着判断如果是docx文档
      • 3.4.遍历匹配关键字
      • 3.5.触发匹配并记录日志
  • 总结


前言

在工作中经常会遇到,需要检查文档千万不能出现某个关键词,一个文档那还好说。但如果有成千上百个需要检查呢?
下面来给大家介绍一个批量检查的教程。

在这里插入图片描述


一、做成什么样子

  1. 支持当前目录下所有docx文档内容的检查。
  2. 支持当前目录下的子目录里面所有的docx文档内容的检查。
  3. 当前目录出现的问题会在当前目录生成日志文件记录下来。
  4. 日志格式为:<<文件绝对路径>> 文档中出现了关键词:《关键词》。
  5. 支持批量输入关键词,所有关键词都会进行逐一对比。

下面给大家展示一下效果图。
在这里插入图片描述

二、基本架构

主要包括以下几部分:

  1. 库输入模块
  2. 路径输入模块
  3. 关键词输入模块
  4. 数据处理模块

三、前期输入模块

库、路径、关键词比较简单。我就把它们全部写到这一节。

1.引入库

代码如下:

import docx
import os
import re

docx:用来读取文档内容的。
os:用来搞定一系列路径问题。
re:正则表达式模块,用来给关键词搞精确匹配的。


2.路径输入

代码如下:

print(r'请输入文档完整路径(例子:E:\vtest):', end='')
file_path = input()# 获取目录下的所有条目
entries = os.listdir(file_path)
print(entries)

输入路径后,程序会先获取一下当前路径下的东西,形成一个列表并打印出来。


3.关键词输入

代码如下:

# 获取关键词列表
Prohibited_lists = []
while True:print('请输入要查询的关键字(例子:奥利给),按q退出输入:', end='')Prohibited_words = input()if Prohibited_words == 'q':breakProhibited_lists.append(Prohibited_words)print("退出循环,禁止词汇列表:", Prohibited_lists)

首先,创建一个空列表,用来存储用户输入的关键词。
其次,一个while循环,用来保持用户可以一直输入关键词。
然后,关键词触发,当用户输入q可以退出输入关键程序。
最后,打印一条信息,告诉用户都有哪些关键词会进行匹配。


三、数据处理模块

这里我先写一下处理逻辑。

1.基本架构

代码如下:

for entry in entries:if entry.endswith('.docx'):    # 如果是docx文档...........       elif os.path.isdir(os.path.join(file_path, entry)):    # 如果目录里的东西还是个目录...........

首先,搞个循环结构,遍历一下用户输入的路径下的东西。
其次,对这些东西进行判断,进行两中不同的操作。
下面我将会按照这个结构顺序来写。


2.如果是docx文档

2.1.读取当前文档内容

代码如下:

for entry in entries:if entry.endswith('.docx'):    # 如果是docx文档# 使用os.path.join()构造完整文件路径full_entry_path = os.path.join(file_path, entry)# 使用 python-docx 打开文档doc = docx.Document(full_entry_path)# 将每一个段落的文本合并为一个字符串text = " ".join([para.text for para in doc.paragraphs])

首先,根据当前遍历的文件和用户输入的路径来共同构成完整文件路径。
其次,根据完整文件路径,读取文件内容。
最后,将每一个段落的文本合并为一个字符串,便于后面的关键字匹配。


2.2.遍历匹配关键字

代码如下:

        # 遍历关键字列表for Prohibited_list in Prohibited_lists:# 正则表达式匹配关键字ProhibitedRegex = re.compile(rf'.*{Prohibited_list}+.*')mo = ProhibitedRegex.search(text)

这里我们用的是正则表达式匹配关键字。看不懂的同学要去看下正则表达式的知识点喽。

ProhibitedRegex = re.compile(rf’.{Prohibited_list}+.') 这行代码创建了一个正则表达式对象,用于查找包含在 Prohibited_list 关键词。

mo = ProhibitedRegex.search(text) 这行代码使用了上面创建的正则表达式对象来搜索 text 中是否存在匹配的禁止词汇。如果找到匹配项,则返回一个匹配对象(MatchObject),否则返回 None。


2.3.触发匹配并记录日志

代码如下:

            # 如果匹配到了关键字if mo is not None:# 使用os.path.join()构造完整文件路径full_text_path = os.path.join(file_path, 'problems.txt')# 将问题写入text文档,并保存到当前目录with open(full_text_path, 'a') as f:f.write(f'<<{full_entry_path}>> 文档中出现了关键词:{Prohibited_list}\n')# 如果没有匹配到关键字else:print(f'<<{full_entry_path}>> 文档没有出现关键词:{Prohibited_list}。')

一目了然,共分成两部分:一是匹配到了关键字;二是没有匹配到关键字。

匹配到了:第一步先构建日志文件的路径;第二步将问题写入到text文档,并保存到当前目录(如果当前目录没有该文件,会自动创建。)

没匹配到:就简单提示一下啦。


3.如果目录下还有一个目录

3.1.判断并生成新目录

代码如下:

    # 判断目录下是否还有目录elif os.path.isdir(os.path.join(file_path, entry)):# 使用字符串拼接一下路径,生成新路径(给子目录下的文档使用)file_path = file_path + '\\' + entry      

一般我们保存文件不会一股脑的都保存到一个目录中。最起码目录中再搞一个子目录分一下类。
这个代码就是处理这个问题的。


3.2.获取子目录里的东西并遍历它

代码如下:

        # 获取目录下的所有条目entries = os.listdir(file_path)print(entries)# 遍历当前所有条目for entry_1 in entries:

接下来就是获取一下子录下的所有东西啦。
然后再搞一个遍历结构,一个一个的处理它们。


3.3.接着判断如果是docx文档

代码如下:

            if entry_1.endswith('.docx'):# 使用os.path.join()构造完整文件路径full_entry_path = os.path.join(file_path, entry_1)# 使用 python-docx 打开文档doc = docx.Document(full_entry_path)# 将每一个段落的文本合并为一个字符串text = " ".join([para.text for para in doc.paragraphs])

请参考 《2.1.读取当前文档内容》


3.4.遍历匹配关键字

代码如下:

                # 正则表达式匹配关键字for Prohibited_list in Prohibited_lists:ProhibitedRegex = re.compile(rf'.*{Prohibited_list}+.*')mo = ProhibitedRegex.search(text)

请参考 《2.2.遍历匹配关键字》


3.5.触发匹配并记录日志

代码如下:

                    if mo is not None:# 使用os.path.join()构造完整文件路径full_text_path = os.path.join(file_path, 'problems.txt')# 将问题写入text文档,并保存到当前目录with open(full_text_path, 'a') as f:f.write(f'<<{full_entry_path}>> 文档中出现了关键词:{Prohibited_list}\n')else:print(f'<<{full_entry_path}>> 文档没有出现关键词:{Prohibited_list}。')

请参考 《2.3.触发匹配并记录日志》


总结

以上的代码,包括我之前写的所有代码,都是在Python 3.11版本下写的,其它版本下运行可能会有问题。并且以上代码可以直接按顺序复制粘贴就可以使用,不用再调格式(可以发现越往后代码前面的空格越多,这个就是格式)。用起来有问题可以私信或者评论给我哦。

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

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

相关文章

Linux shell编程学习笔记35:seq

0 前言 在使用 for 循环语句时&#xff0c;我们经常使用到序列。比如&#xff1a; for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i * 2 $(expr $i \* 2)"; done 其中的 1 2 3 4 5 6 7 8 9 10;就是一个整数序列 。 为了方便我们使用数字序列&#xff0c;Linux提供了…

Python 小程序之PDF文档加解密

PDF文档的加密和解密 文章目录 PDF文档的加密和解密前言一、总体构思二、使用到的库三、PDF文档的加密1.用户输入模块2.打开并读取文档数据3.遍历保存数据到新文档4.新文档进行加密5.新文档命名生成路径6.保存新加密的文档 四、PDF文档的解密1.用户输入模块2.前提准备2.文件解密…

jmeter和postman的对比

1.创建接口用例集&#xff08;没区别&#xff09; Postman是Collections&#xff0c;Jmeter是线程组&#xff0c;没什么区别。 2.步骤的实现&#xff08;有区别&#xff09; Postman和jmeter都是创建http请求 区别1&#xff1a;postman请求的请求URL是一个整体&#xff0c;j…

玩转大数据15:常用的分类算法和聚类算法

前言 分类算法和聚类算法是数据挖掘和机器学习中的两种常见方法。它们的主要区别在于处理数据的方式和目标。 分类算法是在已知类别标签的数据集上训练的&#xff0c;用于预测新的数据点的类别。聚类算法则是在没有任何类别标签的情况下&#xff0c;通过分析数据点之间的相似性…

智能优化算法应用:基于帝国主义竞争算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于帝国主义竞争算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于帝国主义竞争算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.帝国主义竞争算法4.实验参数设定…

图论——二分图

图论——二分图 二分图通俗解释 有一个图&#xff0c;将顶点分成两类&#xff0c;边只存在不同类顶点之间&#xff0c;同类顶点之间设有边。称图 G 为二部图&#xff0c;或称二分图&#xff0c;也称欧图。 性质 二分图不含有奇数环图中没有奇数环&#xff0c;一定可以转换为二…

OpenAI Q* (Q Star)简单介绍

一、Q Star 名称由来 Q* 的两个可能来源如下&#xff1a; 1&#xff09;Q 可能是指 "Q-learning"&#xff0c;这是一种用于强化学习的机器学习算法。 Q 名称的由来*&#xff1a;把 "Q*"想象成超级智能机器人的昵称。 Q 的意思是这个机器人非常善于做决定…

pytest-fixtured自动化测试详解

fixture的作用 1.同unittest的setup和teardown,作为测试前后的初始化设置。 fixture的使用 1.作为前置条件使用 2.fixture的的作用范围 1.作为前置条件使用 pytest.fixture() def a():return 3def test_b(a):assert a3 2.fixture的作用范围 首先实例化更高范围的fixture…

Rust语言GUI库之gtk安装

文章目录 工具链安装管理软件vcpkgvcpkg介绍安装vcpkg 安装gtk遇到的问题Rust其他依赖package-confg 工具链安装管理软件vcpkg vcpkg介绍 在使用C/C编写项目时, 引用第三方库是很麻烦的事, 需要手动下载源码然后编译最后再添加到项目里&#xff0c;配置头文件、lib、dll&…

应用程序映射的 5 个安全优势

现代企业依靠无数的软件应用程序来执行日常运营。这些应用程序相互连接并协同工作以提供所需的服务。了解这些应用程序如何相互交互以及底层基础设施对于任何组织都至关重要。这就是应用程序映射概念的用武之地。 顾名思义&#xff0c;应用程序映射是创建应用程序架构&#xf…

skynet 中 mongo 模块运作的底层原理解析

文章目录 前言总览全流程图涉及模块关系连接数据库函数调用流程图数据库操作函数调用流程图涉及到的代码文件 建立连接SCRAMSASL 操作数据库结语参考链接 前言 这篇文章总结 skynet 中 mongo 的接入流程&#xff0c;代码解析&#xff0c;读完它相信你对 skynet 中的 mongo 调用…

JMeter直连数据库

JMeter直连数据库 使用场景操作步骤 使用场景 用作请求的参数化 登录时需要的用户名&#xff0c;密码可以从数据库中查询获取 用作结果的断言 添加购物车下订单&#xff0c;检查接口返回的订单号&#xff0c;是否与数据库中生成的订单号一致 清理垃圾数据 添加商品后&#xff…

汽车IVI中控开发入门及进阶(十一):ALSA音频

前言 汽车中控也被称为车机、车载多媒体、车载娱乐等,其中音频视频是非常重要的部分,音频比如播放各种格式的音乐文件、播放蓝牙接口的音乐、播放U盘或TF卡中的音频文件,如果有视频文件也可以放出音频,看起来很简单,在windows下音乐播放器很多,直接打开文件就能播放各…

生产派工自动化:MES系统的关键作用

随着制造业的数字化转型和智能化发展&#xff0c;生产派工自动化成为了提高生产效率、降低成本&#xff0c;并实现优质产品生产的关键要素之一。制造执行系统&#xff08;MES&#xff09;在派工自动化中发挥着重要作用&#xff0c;通过实时数据采集和智能调度&#xff0c;优化生…

项目一:IIC读写EEPROM AT24C02

回头想了想在工作中调过的EEPROM还挺多的&#xff0c;有M24M02 、M28010 、AT24C02等&#xff0c;今天讲一下AT24C02吧 一、AT24C02简介 1.1 特点 文档已经上传了&#xff0c;需要的同学可以自行下载哈&#xff0c;晚点我会把下载链接附上来。 我大概照着文档翻译了一下&am…

排序算法-快速排序

1.快速排序&#xff08;递归&#xff09; 快速排序是 Hoare 于 1962 年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a; 任取待排序元素序列中 的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素…

已经写完的论文怎么降低查重率 papergpt

大家好&#xff0c;今天来聊聊已经写完的论文怎么降低查重率&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 已经写完的论文怎么降低查重率 背景介绍 在学术界&#xff0c;论文的查重率是评价论文质量的…

mysql的ON DELETE CASCADE 和ON DELETE RESTRICT区别

​​ON DELETE CASCADE​​​ 和 ​​ON DELETE RESTRICT​​ 是 MySQL 中两种不同的外键约束级联操作。它们之间的主要区别在于当主表中的记录被删除时&#xff0c;子表中相关记录的处理方式。 ON DELETE CASCADE: 当在主表中删除一条记录时&#xff0c;所有与之相关的子表中…

Java 入门第二篇,Java发展史

Java 入门第二篇&#xff0c;Java发展史 一&#xff0c;Java之诞生 Java的诞生可以追溯到20世纪90年代初。以下是Java诞生的背景和过程&#xff1a; 背景&#xff1a;在上世纪80年代和90年代初&#xff0c;计算机领域存在着多样化的硬件和操作系统&#xff0c;开发者需要为不同…

计算机操作系统-第十三天

目录 前言 进程通信&#xff08;IPC&#xff09; 进程通信的方法 共享存储 消息传递 直接通信方式 间接通信方式&#xff08;信箱通信方式&#xff09; 管道通信 本节思维导图 前言 &#xff01;&#xff01;&#xff01;回归&#xff01;&#xff01;&#xff01; …