Python实现在多个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 Truereturn False # 如果没有找到文本,则返回Falseexcept 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 SubEnd IfEnd With' 根据用户选择的路径获取文件夹对象Set objFolder = objFSO.GetFolder(strFolderPath)' 初始化当前页码为1iCurrentPage = 1' 遍历文件夹中的所有.docx文件For Each objFile In objFolder.Files' 检查文件扩展名是否为docxIf LCase(objFSO.GetExtensionName(objFile.Name)) = "docx" Then' 打开文档,不显示界面Set objDoc = Documents.Open(objFile.Path, Visible:=False)' 调用宏设置页码,传入当前页码Call e自动前节设置(objDoc, iCurrentPage)' 调用辅助函数获取当前文档的总页数iTotalPages = GetTotalPages(objDoc)' 更新当前页码为下一个文档的起始页码iPreviousTotal = iCurrentPageiCurrentPage = iTotalPages + iPreviousTotal' 保存并关闭文档objDoc.Close SaveChanges:=TrueEnd IfNext 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.CountEnd 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 SectionFor Each oSection In oDoc.SectionsIf oSection.Index = 1 ThenWith oSection.Footers(wdHeaderFooterPrimary).PageNumbers.NumberStyle = wdPageNumberStyleArabic.RestartNumberingAtSection = True.StartingNumber = iStartingPageEnd WithElseWith oSection.Footers(wdHeaderFooterPrimary).PageNumbers.RestartNumberingAtSection = FalseEnd WithEnd IfNext oSectionEnd 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 SubEnd IfEnd With' 根据用户选择的路径获取文件夹对象Set objFolder = objFSO.GetFolder(strFolderPath)' 初始化当前页码为1iCurrentPage = 1' 遍历文件夹中的所有.docx文件For Each objFile In objFolder.Files' 检查文件扩展名是否为docxIf LCase(objFSO.GetExtensionName(objFile.Name)) = "docx" Then' 打开文档,不显示界面Set objDoc = Documents.Open(objFile.Path, Visible:=False)' 调用宏设置页码,传入当前页码Call e自动前节设置(objDoc, iCurrentPage)' 调用辅助函数获取当前文档的总页数iTotalPages = GetTotalPages(objDoc)' 更新当前页码为下一个文档的起始页码iPreviousTotal = iCurrentPageiCurrentPage = iTotalPages + iPreviousTotal' 保存并关闭文档objDoc.Close SaveChanges:=TrueEnd IfNext objFile' 显示消息框,告知用户所有文档的页码设置完成MsgBox "所有文档的页码设置完成。"End Sub' 辅助函数,用于获取文档的总页数Function GetTotalPages(ByRef oDoc As Document) As Integer' 获取当前文档的总页数,返回给调用者GetTotalPages = oDoc.Windows(1).Panes(1).Pages.CountEnd 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 ThenWith oSection.Footers(wdHeaderFooterPrimary).PageNumbers' 设置页码样式为阿拉伯数字.NumberStyle = wdPageNumberStyleArabic' 设置在该节重新开始页码编号.RestartNumberingAtSection = True' 设置起始页码.StartingNumber = iStartingPageEnd WithElse' 对于其他节,不重新开始页码编号With oSection.Footers(wdHeaderFooterPrimary).PageNumbers.RestartNumberingAtSection = FalseEnd WithEnd IfNext oSectionEnd Sub |
注意事项
- 确保所有文档都是Word文档(.docx格式)。
- 宏在设置页码时不会更改文档的内容。
- 如果文件夹中包含非Word文档,宏将忽略这些文件。
到此这篇关于Python实现在多个Word文档中一键搜索的文章就介绍到这了。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需129元,即可下载本站文章涉及的文件和软件。

