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

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

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

引言

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

环境准备

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

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

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

1
pip install python-docx

脚本详解

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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设置连续页码并遍历文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
' 辅助函数,用于设置文档的页码
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文档的文件夹。
  • 宏将自动为每个文档设置连续页码,并在完成后弹出提示消息。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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文档中一键搜索的文章就介绍到这了。

 

学习资料见知识星球。

以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。

快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利​​​​!

更多技巧, www.excelbook.cn

欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;

Excelbook.cn Excel技巧 SQL技巧 Python 学习!

你将获得:

1、价值上万元的专业的PPT报告模板。

2、专业案例分析和解读笔记。

3、实用的Excel、Word、PPT技巧。

4、VIP讨论群,共享资源。

5、优惠的会员商品。

6、一次付费只需129元,即可下载本站文章涉及的文件和软件。

文章版权声明 1、本网站名称:Excelbook
2、本站永久网址:http://www.excelbook.cn
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长王小琥进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。

THE END
分享
二维码
< <上一篇
下一篇>>