Python为Word文档添加书签并打包成exe

背景简述

由于一些工作场景,需要从多个Word文档中找到出现的关键词,并阅读关键词的上下文内容。文件可能几十个,手动操作太要命了。所以python尝试处理。

目录

  • 背景简述
  • 思路
  • 第一步、功能实现
    • 结果验证
  • 第二步、打包成exe
    • 2-1、基础准备
    • 2-2、打包

思路

第一步、功能实现
把这些Word文档都放在一个文件夹中。

  1. Python读取指定目录下的文件,然后找到包含了关键词的文档名称
  2. 把这些关键词都打上书签,这样使用书签就可以快速定位了
  3. 可以选择要不要打开含有关键词的文件,不用自己打开了

第二步、打包成exe
因为想把这个给别人用,但是他们电脑上不一定有Python环境,一个个安装太麻烦,所以打包,做成exe,会便捷些。

第一步、功能实现

import os
import re
import platform
import subprocess
from docx import Document
from docx.oxml.shared import OxmlElement, qn# --------------------- 核心功能函数 ---------------------
def find_keyword_files(folder_path, keyword):"""查找包含关键词的文档"""matched_files = []for root, dirs, files in os.walk(folder_path):for file in files:if file.endswith(".docx"):full_path = os.path.join(root, file)if check_docx_contains_keyword(full_path, keyword):matched_files.append(full_path)return matched_filesdef check_docx_contains_keyword(file_path, keyword):"""检查单个文档是否包含关键词"""try:doc = Document(file_path)for para in doc.paragraphs:if keyword in para.text:return Truefor table in doc.tables:for row in table.rows:for cell in row.cells:if keyword in cell.text:return Truereturn Falseexcept Exception as e:print(f"检测失败:{file_path} - {str(e)}")return Falsedef add_bookmarks_to_file(file_path, keyword):"""为文件添加书签并保存"""doc = Document(file_path)bookmark_counter = 0def process_paragraph(para):nonlocal bookmark_counterif keyword in para.text:parts = re.split(f'({re.escape(keyword)})', para.text)para.clear()for part in parts:if part == keyword:bookmark_counter += 1# 添加书签开始start = OxmlElement("w:bookmarkStart")start.set(qn("w:id"), str(bookmark_counter))start.set(qn("w:name"), f"关键词标记_{bookmark_counter}")para._p.append(start)# 添加文本run = para.add_run(part)run.bold = True# 添加书签结束end = OxmlElement("w:bookmarkEnd")end.set(qn("w:id"), str(bookmark_counter))end.set(qn("w:name"), f"关键词标记_{bookmark_counter}")para._p.append(end)else:para.add_run(part)# 处理段落for para in doc.paragraphs:process_paragraph(para)# 处理表格for table in doc.tables:for row in table.rows:for cell in row.cells:for para in cell.paragraphs:process_paragraph(para)new_path = os.path.splitext(file_path)[0] + "_已标记.docx"doc.save(new_path)return new_pathdef open_file(file_path):"""跨平台打开文件"""if platform.system() == 'Windows':os.startfile(file_path)elif platform.system() == 'Darwin':subprocess.run(['open', file_path])else:subprocess.run(['xdg-open', file_path])# --------------------- 用户交互流程 ---------------------
def main():default_keyword = "作弊"  # 默认关键词user_input = input(f"请输入要查找的关键词(直接回车将使用默认值'{default_keyword}'):").strip()keyword = user_input if user_input else default_keywordfolder_path = input("请输入要扫描的文件夹路径:")# 第一步:查找文件print("\n正在扫描文档...")target_files = find_keyword_files(folder_path, keyword)if not target_files:print("未找到包含关键词的文档")returnprint("\n找到以下包含关键词的文档:")for idx, path in enumerate(target_files, 1):print(f"{idx}. {os.path.basename(path)}")# 第二步:询问是否添加书签q1 = input(f"\n是否要为这些文档中的所有'{keyword}'字样添加书签?(y/n): ").strip().lower()if q1 not in ['y', 'yes', '是']:print("已取消操作")return# 处理文件processed_files = []for file in target_files:try:new_path = add_bookmarks_to_file(file, keyword)processed_files.append(new_path)print(f"✓ 已完成:{os.path.basename(new_path)}")except Exception as e:print(f"✗ 处理失败:{os.path.basename(file)} - {str(e)}")# 第三步:询问是否打开文件q2 = input("\n是否要打开处理后的文档?(y/n): ").strip().lower()if q2 in ['y', 'yes', '是']:for path in processed_files:try:open_file(path)print(f"已打开:{os.path.basename(path)}")except Exception as e:print(f"打开失败:{os.path.basename(path)} - {str(e)}")print("\n操作完成!")if __name__ == "__main__":main()

结果验证

在jupyter上看的话
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

第二步、打包成exe

2-1、基础准备

  1. 将上述代码保存成.py文件,比如我的是find_str_to_bookmark.py
  2. 准备一个程序图标
    Windows:使用在线工具将图片转为 .ico 格式(推荐 icoconvert.com)
  3. 创建Shell脚本,把下面这段保存成一个.bat文件。
    ( 此步骤要确保安装了PyInstaller库。另外,参数有讲究,之前我加了 --noconsole,有因为使用了input函数造成报错。)
@echo off
rem 打包为单个exe文件,隐藏控制台窗口,自定义图标
pyinstaller --onefile  --name "文档标记助手" --icon=app.ico find_str_to_bookmark.py
pause

2-2、打包

把.py文件、.ico文件、.bat文件放在一个文件夹中。
然后双击执行.bat文件,会在dist文件夹中生成打包好的exe。
在这里插入图片描述
试一试,双击这个exe文件:
在这里插入图片描述
看着是可以的,我需要找个没有安装Python的电脑再试一下。


好久不写,最近AI火热,这个是借助AI来实现,然后自己微调。
效率上确实翻番,但是也遇到一些问题。
1、遇到报错时,AI提供的思路很多,有时候反倒不容易验证:
当按照它第一个方案来又出现一个错误的话,就需要自己判断是继续解决这个错误,还是马上转到方案二了。
2、思路调整时,AI新给的代码可能和上一次差异大,有时会缺失上一次中的一些东西。那对于编程语言不够熟悉情况下,就有点麻烦。比如我按照它给的shell脚本执行报错,给到它相关信息后,它再给我的代码变化那个ico的设置没有了,只能再要求它加上。
再后来怎么改都不对,要不打包失败,要么exe不能运行。后来也蒙了,干脆回到了它给我的第一个方案,然后和他说“之前的报错都忘记,从生成exe开始说”,最后居然成功了,就在原来基础上修改了一点点。
在这里插入图片描述

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

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

相关文章

【MYSQL】索引和事务

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 本期内容讲解 MySQL 中的索引和事务,在学习的过程中,我们需要经常问自己为什么 文章目录 1. 索…

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A:空间(填空5分_单位转换) 2B:卡片(填空5分_模拟) 3C:直线(填空10分_数学排序) 4D:货物摆放(填空10分_质因数) 5E&#xf…

PicGo安装与配置-Gitee图床

1、 前言 平时使用Typora写文章,上传文章到第三方平台上去都要把图片一个一个上传上去,于是我就百度了有没有什么方法可以省略这一步骤,我发现Typora可以用PicGo+Gitee图床方式,这个挺容易的,我把安装的过程在此记录下来。 PicGo是一个用于快速上传图片并获取图片 URL 链…

html css js网页制作成品——HTML+CSS+js迪奥口红网站网页设计(4页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…

重学Java基础篇—如何优雅的删除HashMap元素

在Java中优雅地删除HashMap元素需要注意遍历时的安全性和代码的简洁性。 以下是几种推荐的方法: 1. 使用迭代器遍历并删除(传统方式) 在遍历时通过迭代器的remove() 方法删除元素,避免ConcurrentModificationException异常。 H…

26考研——图_图的遍历(6)

408答疑 文章目录 三、图的遍历图的遍历概述图的遍历算法的重要性图的遍历与树的遍历的区别图的遍历过程中的注意事项避免重复访问遍历算法的分类遍历结果的不唯一性 广度优先搜索广度优先搜索(BFS)概述BFS 的特点广度优先遍历的过程示例图遍历过程 BFS …

2025-03-24 学习记录--C/C++-PTA 习题7-6 统计大写辅音字母

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 习题7-6 统计大写辅音字母 英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序,统计给…

在vitepress中使用vue组建,然后引入到markdown

在 VitePress 中&#xff0c;每个 Markdown 文件都被编译成 HTML&#xff0c;而且将其作为 Vue 单文件组件处理。这意味着可以在 Markdown 中使用任何 Vue 功能&#xff0c;包括动态模板、使用 Vue 组件或通过添加 <script> 标签为页面的 Vue 组件添加逻辑。 值得注意的…

常见中间件漏洞之一 ----【Tomcat】

中间件Tomcat介绍&#xff1a; tomcat是⼀个开源⽽且免费的jsp服务器&#xff0c;默认端⼝ : 8080&#xff0c;属于轻量级应⽤服务器。它可以实现 JavaWeb程序的装载&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系统必备的⼀款环境。 在历史上也披露…

Spring Cloud之负载均衡之LoadBalance

目录 负载均衡 问题 步骤 现象 什么是负载均衡&#xff1f; 负载均衡的一些实现 服务端负载均衡 客户端负载均衡 使用Spring Cloud LoadBalance实现负载均衡 负载均衡策略 ​编辑 ​编辑LoadBalancer原理 服务部署 准备环境和数据 服务构建打包 启动服务 上传J…

量化研究--小果聚宽交易系统上线高速服务器,提供源代码

文章链接量化研究--小果聚宽交易系统上线高速服务器&#xff0c;提供源代码https://mp.weixin.qq.com/s/HecSeAvmaCyVCsPhvxA0xg 今天大家反应以前的服务器比较慢&#xff0c;与200多人在使用这个系统&#xff0c;反应比较慢&#xff0c;实时数据请求服务器&#xff0c;服务器还…

蓝桥杯python组备考2(b站课程笔记)超详细

语法进阶 一、列表推导式 想讲解一下示例4到示例7的代码&#xff1a; 4、循环n次生成n个零放进列表中&#xff0c;其实也就是相当于[0]*n&#xff08;列表乘法&#xff0c;将原来的列表循环n次产生一个新的列表&#xff09;&#xff0c;接着在循环n次产生n个这样的列表&#x…

【大模型LLM第十四篇】Agent学习之anthropic-quickstarts Agent

前言 对于anthropic api的快速使用&#xff0c;在github上有几个example Customer Support Agent&#xff1a;由 Claude 提供支持的客户支持代理。该项目演示了如何利用 Claude 的自然语言理解和生成功能来创建可访问知识库的 AI 辅助客户支持系统。Financial Data Analyst &…

用DrissionPage升级网易云音乐爬虫:更稳定高效地获取歌单音乐(附原码)

一、传统爬虫的痛点分析 原代码使用requests re的方案存在以下局限性&#xff1a; 动态内容缺失&#xff1a;无法获取JavaScript渲染后的页面内容 维护成本高&#xff1a;网页结构变化需频繁调整正则表达式 反爬易触发&#xff1a;简单请求头伪造容易被识别 资源消耗大&am…

2025年渗透测试面试题总结- PingCAP安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 PingCAP安全工程师 一、SQL注入判断数据库类型技术分析 1. 常规判断方法 2. 盲注场景下的判断 3. 补…

【加密社】如何创建自己的币圈工具站

需要准备的工作 1.域名 2.服务器 周末的时候主要弄了快讯这方面的代码 我这里用的是星球日报的api&#xff0c;也可以订阅他们的rss&#xff0c;这部分在github上是开源的 https://github.com/ODAILY 我这里用的是WordPressonenav主题&#xff0c;然后用小工具在主页展示&am…

Oracle归档配置及检查

配置归档位置到 USE_DB_RECOVERY_FILE_DEST&#xff0c;并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统&#xff0c;支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…

FPGA_DDS_IP核

接下来对FPGA的DDS的ip核进行学习。 首先对DDS需要有些了解 DDS信号发生器采用直接数字频率合成&#xff08;Direct Digital Synthesis&#xff0c;简称DDS&#xff09;技术&#xff0c;简单来说就是 需要一个系统频率和一个输入的数字数据 &#xff0c;用这个系统频率计算出…

欢迎来到未来:探索 Dify 开源大语言模型应用开发平台

欢迎来到未来&#xff1a;探索 Dify 开源大语言模型应用开发平台 如果你对 AI 世界有所耳闻&#xff0c;那么你一定听说过大语言模型&#xff08;LLM&#xff09;。这些智能巨兽能够生成文本、回答问题、甚至编写代码&#xff01;但是&#xff0c;如何将它们变成真正的实用工具…