背景简述
由于一些工作场景,需要从多个Word文档中找到出现的关键词,并阅读关键词的上下文内容。文件可能几十个,手动操作太要命了。所以python尝试处理。
目录
- 背景简述
- 思路
- 第一步、功能实现
- 结果验证
- 第二步、打包成exe
- 2-1、基础准备
- 2-2、打包
思路
第一步、功能实现
把这些Word文档都放在一个文件夹中。
- Python读取指定目录下的文件,然后找到包含了关键词的文档名称
- 把这些关键词都打上书签,这样使用书签就可以快速定位了
- 可以选择要不要打开含有关键词的文件,不用自己打开了
第二步、打包成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_files
def check_docx_contains_keyword(file_path, keyword):
"""检查单个文档是否包含关键词"""
try:
doc = Document(file_path)
for para in doc.paragraphs:
if keyword in para.text:
return True
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
if keyword in cell.text:
return True
return False
except Exception as e:
print(f"检测失败:{file_path} - {str(e)}")
return False
def add_bookmarks_to_file(file_path, keyword):
"""为文件添加书签并保存"""
doc = Document(file_path)
bookmark_counter = 0
def process_paragraph(para):
nonlocal bookmark_counter
if 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_path
def 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_keyword
folder_path = input("请输入要扫描的文件夹路径:")
# 第一步:查找文件
print("\n正在扫描文档...")
target_files = find_keyword_files(folder_path, keyword)
if not target_files:
print("未找到包含关键词的文档")
return
print("\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、基础准备
- 将上述代码保存成.py文件,比如我的是find_str_to_bookmark.py
- 准备一个程序图标
Windows:使用在线工具将图片转为 .ico 格式(推荐 icoconvert.com) - 创建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开始说”,最后居然成功了,就在原来基础上修改了一点点。