Python实现在多个Word文档中一键搜索

 更新时间:2025年07月11日 10:45:26   作者:威码视界  
在日常工作和学习中,我们经常需要在大量word文档中查找特定的文本,下面小编就来和大家介绍一下如何使用Python脚本在同一文件夹下的所有word文件中搜索指定的文本吧

引言

在日常工作和学习中,我们经常需要在大量word文档中查找特定的文本。虽然手动搜索是一种方法,但这种方法不仅效率低下,而且容易出错。幸运的是,Python提供了强大的库和工具,可以帮助我们自动化这一过程。本文将介绍如何使用Python脚本在同一文件夹下的所有word文件中搜索指定的文本。

环境准备

在开始之前,你需要确保你的Python环境已经安装了以下库:

  • os:用于操作系统功能。
  • tkinter:用于图形用户界面。
  • docx:用于处理Word文档。

你可以通过以下命令安装所需的库:

pip install python-docx

脚本详解

以下是完整的代码,我们将逐步解析其功能。

import os  # 导入os模块,用于文件路径操作
from tkinter import Tk, filedialog  # 导入Tk和filedialog模块,用于图形界面操作
from docx import Document  # 导入Document模块,用于读取Word文档

def search_in_docx(file_path, search_text):
    """
    在指定的Word文档中搜索指定的文本。
    :param file_path: Word文档的路径
    :param search_text: 要搜索的文本
    :return: 如果找到文本则返回True,否则返回False
    """
    try:
        doc = Document(file_path)  # 打开Word文档
        for para in doc.paragraphs:  # 遍历文档中的每个段落
            if search_text in para.text:  # 检查段落中是否包含搜索文本
                print(f"在文件 {os.path.basename(file_path)} 的段落中找到: {para.text}")
                return True
        return False  # 如果没有找到文本,则返回False
    except Exception as e:
        print(f"读取文件 {file_path} 出错: {e}")
        return False  # 捕获并打印异常信息

def search_in_directory(directory_path, search_text):
    """
    在指定目录及其子目录中的所有Word文档中搜索指定的文本。
    :param directory_path: 要搜索的目录路径
    :param search_text: 要搜索的文本
    """
    for root, dirs, files in os.walk(directory_path):  # 遍历目录
        for file in files:  # 检查每个文件
            if file.endswith('.docx'):  # 只处理Word文档(.docx格式)
                file_path = os.path.join(root, file)  # 获取文件的完整路径
                print(f"正在搜索文件 {os.path.basename(file_path)}...")  # 显示正在搜索的文件名
                if search_in_docx(file_path, search_text):  # 调用search_in_docx函数
                    print(f"在文件 {os.path.basename(file_path)} 中找到了 '{search_text}'")  # 显示找到的文本

def get_directory_path():
    """
    弹出图形界面对话框,让用户选择要搜索的目录。
    :return: 用户选择的目录路径
    """
    Tk().withdraw()  # 隐藏主窗口
    directory_path = filedialog.askdirectory(title="请选择要搜索的目录")  # 弹出选择文件夹的对话框
    return directory_path  # 返回用户选择的目录路径

if __name__ == "__main__":
    directory_path = get_directory_path()  # 获取用户选择的目录路径
    if directory_path:  # 如果用户选择了目录
        search_text = input("请输入要搜索的文本: ")  # 获取用户输入的要搜索的文本
        search_in_directory(directory_path, search_text)  # 调用search_in_directory函数
    else:
        print("未选择目录。")  # 如果用户没有选择目录,则打印提示信息

函数解析

search_in_docx:这个函数接收文件路径和要搜索的文本作为参数。它打开一个.docx文件,并遍历文件中的所有段落。如果段落中包含指定的文本,则打印出该段落,并返回True。

search_in_directory:这个函数接收目录路径和要搜索的文本作为参数。它遍历指定目录及其子目录中的所有文件。如果文件是.docx格式,它将调用search_in_docx函数进行搜索。如果找到指定的文本,将打印出文件名和搜索结果。

get_directory_path:这个函数使用tkinter库弹出一个对话框,让用户选择要搜索的目录。它隐藏主窗口,并返回用户选择的目录路径。

主程序:在主程序中,首先调用get_directory_path函数获取用户选择的目录路径。如果用户选择了目录,程序将提示用户输入要搜索的文本,并调用search_in_directory函数进行搜索。如果没有选择目录,程序将打印出相应的提示信息。

使用方法

确保你的Python环境已安装所需的库。

将上述代码保存为一个.py文件。

运行该脚本,选择要搜索的文件夹,然后输入要搜索的文本。

程序将自动搜索指定目录中的所有.docx文件,并显示包含指定文本的文件和段落。

知识扩展

Python一键为多个Word文档设置连续页码

在处理多个Word文档时,我们经常需要对这些文档进行连续页码设置,以便于打印和分发。手动设置每个文档的页码不仅耗时,而且容易出错。为了解决这个问题,我编写了一个VBA宏,它可以自动为一个文件夹中的所有Word文档设置连续的页码。本文将详细介绍这个宏的工作原理和使用方法。

宏的功能

这个VBA宏的主要功能是:

  • 允许用户选择一个文件夹,宏将遍历该文件夹中的所有Word文档(.docx格式)。
  • 按该文件夹下的文档顺序,为每个文档设置连续的页码,确保文档之间没有页码重复且页码不中断。
  • 通过一个辅助函数获取每个文档的总页数,并根据此信息更新下一个文档的起始页码。
  • 通过一个辅助函数为每个文档第一节设置起始页码,后续节为续前节,且不影响原始页脚。

宏的实现

以下是宏的代码实现,包括两个辅助函数和一个主过程。

主过程:a设置连续页码并遍历文档

Sub a设置连续页码并遍历文档()
    ' 定义变量用于存储文件夹路径
    Dim strFolderPath As String
    ' 创建FileSystemObject对象,用于操作文件系统
    Dim objFSO As Object
    ' 定义变量用于存储文件夹对象
    Dim objFolder As Object
    ' 定义变量用于存储文件对象
    Dim objFile As Object
    ' 定义变量用于存储Word文档对象
    Dim objDoc As Document
    ' 定义变量用于存储当前页码
    Dim iCurrentPage As Integer
    ' 定义变量用于存储文档的总页数
    Dim iTotalPages As Integer
    ' 定义变量用于存储之前文档的总页数,以便设置连续页码
    Dim iPreviousTotal As Integer
 
    ' 创建FileSystemObject对象
    Set objFSO = CreateObject("Scripting.FileSystemObject")
 
    ' 使用文件选择对话框让用户选择文件夹
    With Application.FileDialog(msoFileDialogFolderPicker)
        ' 如果用户选择了文件夹
        If .Show = -1 Then
            ' 存储选择的文件夹路径
            strFolderPath = .SelectedItems(1) & "\"
        Else
            ' 如果用户取消选择,则显示消息框并退出宏
            MsgBox "未选择文件夹,操作已取消。"
            Exit Sub
        End If
    End With
 
    ' 根据用户选择的路径获取文件夹对象
    Set objFolder = objFSO.GetFolder(strFolderPath)
 
    ' 初始化当前页码为1
    iCurrentPage = 1
 
    ' 遍历文件夹中的所有.docx文件
    For Each objFile In objFolder.Files
        ' 检查文件扩展名是否为docx
        If LCase(objFSO.GetExtensionName(objFile.Name)) = "docx" Then
            ' 打开文档,不显示界面
            Set objDoc = Documents.Open(objFile.Path, Visible:=False)
 
            ' 调用宏设置页码,传入当前页码
            Call e自动前节设置(objDoc, iCurrentPage)
 
            ' 调用辅助函数获取当前文档的总页数
            iTotalPages = GetTotalPages(objDoc)
 
            ' 更新当前页码为下一个文档的起始页码
            iPreviousTotal = iCurrentPage
            iCurrentPage = iTotalPages + iPreviousTotal
 
            ' 保存并关闭文档
            objDoc.Close SaveChanges:=True
        End If
    Next objFile
 
    ' 显示消息框,告知用户所有文档的页码设置完成
    MsgBox "所有文档的页码设置完成。"
End Sub

辅助函数:GetTotalPages

' 辅助函数,用于获取文档的总页数
Function GetTotalPages(ByRef oDoc As Document) As Integer
    ' 获取当前文档的总页数,返回给调用者
    GetTotalPages = oDoc.Windows(1).Panes(1).Pages.Count
End Function

辅助函数:e自动前节设置

' 辅助函数,用于设置文档的页码
Sub e自动前节设置(ByRef oDoc As Document, ByRef iStartingPage As Integer)
    Dim oSection As Section
    For Each oSection In oDoc.Sections
        If oSection.Index = 1 Then
            With oSection.Footers(wdHeaderFooterPrimary).PageNumbers
                .NumberStyle = wdPageNumberStyleArabic
                .RestartNumberingAtSection = True
                .StartingNumber = iStartingPage
            End With
        Else
            With oSection.Footers(wdHeaderFooterPrimary).PageNumbers
                .RestartNumberingAtSection = False
            End With
        End If
    Next oSection
End Sub

使用方法

  • 打开Word,按下 Alt + F11 打开VBA编辑器。
  • 插入一个新的模块,并将上述代码粘贴进去。
  • 运行宏 a设置连续页码并遍历文档。
  • 选择包含Word文档的文件夹。
  • 宏将自动为每个文档设置连续页码,并在完成后弹出提示消息。

完整代码

Sub a设置连续页码并遍历文档()
    ' 定义变量用于存储文件夹路径
    Dim strFolderPath As String
    ' 创建FileSystemObject对象,用于操作文件系统
    Dim objFSO As Object
    ' 定义变量用于存储文件夹对象
    Dim objFolder As Object
    ' 定义变量用于存储文件对象
    Dim objFile As Object
    ' 定义变量用于存储Word文档对象
    Dim objDoc As Document
    ' 定义变量用于存储当前页码
    Dim iCurrentPage As Integer
    ' 定义变量用于存储文档的总页数
    Dim iTotalPages As Integer
    ' 定义变量用于存储之前文档的总页数,以便设置连续页码
    Dim iPreviousTotal As Integer
 
    ' 创建FileSystemObject对象
    Set objFSO = CreateObject("Scripting.FileSystemObject")
 
    ' 使用文件选择对话框让用户选择文件夹
    With Application.FileDialog(msoFileDialogFolderPicker)
        ' 如果用户选择了文件夹
        If .Show = -1 Then
            ' 存储选择的文件夹路径
            strFolderPath = .SelectedItems(1) & "\"
        Else
            ' 如果用户取消选择,则显示消息框并退出宏
            MsgBox "未选择文件夹,操作已取消。"
            Exit Sub
        End If
    End With
 
    ' 根据用户选择的路径获取文件夹对象
    Set objFolder = objFSO.GetFolder(strFolderPath)
 
    ' 初始化当前页码为1
    iCurrentPage = 1
 
    ' 遍历文件夹中的所有.docx文件
    For Each objFile In objFolder.Files
        ' 检查文件扩展名是否为docx
        If LCase(objFSO.GetExtensionName(objFile.Name)) = "docx" Then
            ' 打开文档,不显示界面
            Set objDoc = Documents.Open(objFile.Path, Visible:=False)
 
            ' 调用宏设置页码,传入当前页码
            Call e自动前节设置(objDoc, iCurrentPage)
 
            ' 调用辅助函数获取当前文档的总页数
            iTotalPages = GetTotalPages(objDoc)
 
            ' 更新当前页码为下一个文档的起始页码
            iPreviousTotal = iCurrentPage
            iCurrentPage = iTotalPages + iPreviousTotal
 
            ' 保存并关闭文档
            objDoc.Close SaveChanges:=True
        End If
    Next objFile
 
    ' 显示消息框,告知用户所有文档的页码设置完成
    MsgBox "所有文档的页码设置完成。"
End Sub
 
' 辅助函数,用于获取文档的总页数
Function GetTotalPages(ByRef oDoc As Document) As Integer
    ' 获取当前文档的总页数,返回给调用者
    GetTotalPages = oDoc.Windows(1).Panes(1).Pages.Count
End Function
 
' 辅助函数,用于设置文档的页码
Sub e自动前节设置(ByRef oDoc As Document, ByRef iStartingPage As Integer)
    ' 定义变量用于存储文档节对象
    Dim oSection As Section
    ' 遍历文档的所有节
    For Each oSection In oDoc.Sections
        ' 如果是第一个节,则设置页码样式和起始页码
        If oSection.Index = 1 Then
            With oSection.Footers(wdHeaderFooterPrimary).PageNumbers
                ' 设置页码样式为阿拉伯数字
                .NumberStyle = wdPageNumberStyleArabic
                ' 设置在该节重新开始页码编号
                .RestartNumberingAtSection = True
                ' 设置起始页码
                .StartingNumber = iStartingPage
            End With
        Else
            ' 对于其他节,不重新开始页码编号
            With oSection.Footers(wdHeaderFooterPrimary).PageNumbers
                .RestartNumberingAtSection = False
            End With
        End If
    Next oSection
End Sub

注意事项

  • 确保所有文档都是Word文档(.docx格式)。
  • 宏在设置页码时不会更改文档的内容。
  • 如果文件夹中包含非Word文档,宏将忽略这些文件。

到此这篇关于Python实现在多个Word文档中一键搜索的文章就介绍到这了,更多相关Python多个Word一键搜索内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python Pillow 图像处理库详解(常用Pillow函数及其参数)

    Python Pillow 图像处理库详解(常用Pillow函数及其参数)

    Pillow,原名PIL(Python Imaging Library),是一个功能强大的Python图像处理库,支持多种格式,提供丰富的图像操作功能,如旋转、缩放、颜色转换等,以及易于使用的API,Pillow支持广泛的图像文件格式,并提供图像过滤、绘制等功能
    2024-09-09
  • python hmac模块验证客户端的合法性

    python hmac模块验证客户端的合法性

    这篇文章主要介绍了python hmac模块验证客户端的合法性,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • PyTorch的nn.Module类的定义和使用介绍

    PyTorch的nn.Module类的定义和使用介绍

    在PyTorch中,nn.Module类是构建神经网络模型的基础类,所有自定义的层、模块或整个神经网络架构都需要继承自这个类,本文介绍PyTorch的nn.Module类的定义和使用介绍,感兴趣的朋友一起看看吧
    2024-01-01
  • python上下文管理器异常问题解决方法

    python上下文管理器异常问题解决方法

    在本篇文章里小编给大家整理的是一篇关于python上下文管理器异常问题解决方法,对此有兴趣的朋友们可以学习参考下。
    2021-02-02
  • Python Socket实现简单TCP Server/client功能示例

    Python Socket实现简单TCP Server/client功能示例

    这篇文章主要介绍了Python Socket实现简单TCP Server/client功能,结合实例形式分析了Python基于socket创建TCP服务器Server与客户端client相关实现步骤与操作技巧,需要的朋友可以参考下
    2017-08-08
  • Python实现Opencv cv2.Canny()边缘检测

    Python实现Opencv cv2.Canny()边缘检测

    这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 对Django中时区的解读

    对Django中时区的解读

    这篇文章主要介绍了对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • python3使用smtplib实现发送邮件功能

    python3使用smtplib实现发送邮件功能

    这篇文章主要为大家详细介绍了python3使用smtplib实现发送邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • pytorch finetuning 自己的图片进行训练操作

    pytorch finetuning 自己的图片进行训练操作

    这篇文章主要介绍了pytorch finetuning 自己的图片进行训练操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • python 使用GDAL实现栅格tif转矢量shp的方式小结

    python 使用GDAL实现栅格tif转矢量shp的方式小结

    今天通过本文给大家分享python 使用GDAL实现栅格tif转矢量shp的方式小结,计划是使用栅格转矢量的方式,将栅格数据转为矢量shp文件,然后进行矢量切片,使用Mapbox进行前端动态渲染,具体内容详情跟随小编一起看看吧
    2021-08-08

最新评论