Python實(shí)現(xiàn)在多個(gè)Word文檔中一鍵搜索
引言
在日常工作和學(xué)習(xí)中,我們經(jīng)常需要在大量word文檔中查找特定的文本。雖然手動(dòng)搜索是一種方法,但這種方法不僅效率低下,而且容易出錯(cuò)。幸運(yùn)的是,Python提供了強(qiáng)大的庫(kù)和工具,可以幫助我們自動(dòng)化這一過(guò)程。本文將介紹如何使用Python腳本在同一文件夾下的所有word文件中搜索指定的文本。
環(huán)境準(zhǔn)備
在開始之前,你需要確保你的Python環(huán)境已經(jīng)安裝了以下庫(kù):
os:用于操作系統(tǒng)功能。tkinter:用于圖形用戶界面。docx:用于處理Word文檔。
你可以通過(guò)以下命令安裝所需的庫(kù):
pip install python-docx
腳本詳解
以下是完整的代碼,我們將逐步解析其功能。
import os # 導(dǎo)入os模塊,用于文件路徑操作
from tkinter import Tk, filedialog # 導(dǎo)入Tk和filedialog模塊,用于圖形界面操作
from docx import Document # 導(dǎo)入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: # 遍歷文檔中的每個(gè)段落
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} 出錯(cuò): {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: # 檢查每個(gè)文件
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): # 調(diào)用search_in_docx函數(shù)
print(f"在文件 {os.path.basename(file_path)} 中找到了 '{search_text}'") # 顯示找到的文本
def get_directory_path():
"""
彈出圖形界面對(duì)話框,讓用戶選擇要搜索的目錄。
:return: 用戶選擇的目錄路徑
"""
Tk().withdraw() # 隱藏主窗口
directory_path = filedialog.askdirectory(title="請(qǐng)選擇要搜索的目錄") # 彈出選擇文件夾的對(duì)話框
return directory_path # 返回用戶選擇的目錄路徑
if __name__ == "__main__":
directory_path = get_directory_path() # 獲取用戶選擇的目錄路徑
if directory_path: # 如果用戶選擇了目錄
search_text = input("請(qǐng)輸入要搜索的文本: ") # 獲取用戶輸入的要搜索的文本
search_in_directory(directory_path, search_text) # 調(diào)用search_in_directory函數(shù)
else:
print("未選擇目錄。") # 如果用戶沒有選擇目錄,則打印提示信息函數(shù)解析
search_in_docx:這個(gè)函數(shù)接收文件路徑和要搜索的文本作為參數(shù)。它打開一個(gè).docx文件,并遍歷文件中的所有段落。如果段落中包含指定的文本,則打印出該段落,并返回True。
search_in_directory:這個(gè)函數(shù)接收目錄路徑和要搜索的文本作為參數(shù)。它遍歷指定目錄及其子目錄中的所有文件。如果文件是.docx格式,它將調(diào)用search_in_docx函數(shù)進(jìn)行搜索。如果找到指定的文本,將打印出文件名和搜索結(jié)果。
get_directory_path:這個(gè)函數(shù)使用tkinter庫(kù)彈出一個(gè)對(duì)話框,讓用戶選擇要搜索的目錄。它隱藏主窗口,并返回用戶選擇的目錄路徑。
主程序:在主程序中,首先調(diào)用get_directory_path函數(shù)獲取用戶選擇的目錄路徑。如果用戶選擇了目錄,程序?qū)⑻崾居脩糨斎胍阉鞯奈谋?,并調(diào)用search_in_directory函數(shù)進(jìn)行搜索。如果沒有選擇目錄,程序?qū)⒋蛴〕鱿鄳?yīng)的提示信息。
使用方法
確保你的Python環(huán)境已安裝所需的庫(kù)。
將上述代碼保存為一個(gè).py文件。
運(yùn)行該腳本,選擇要搜索的文件夾,然后輸入要搜索的文本。
程序?qū)⒆詣?dòng)搜索指定目錄中的所有.docx文件,并顯示包含指定文本的文件和段落。
知識(shí)擴(kuò)展
Python一鍵為多個(gè)Word文檔設(shè)置連續(xù)頁(yè)碼
在處理多個(gè)Word文檔時(shí),我們經(jīng)常需要對(duì)這些文檔進(jìn)行連續(xù)頁(yè)碼設(shè)置,以便于打印和分發(fā)。手動(dòng)設(shè)置每個(gè)文檔的頁(yè)碼不僅耗時(shí),而且容易出錯(cuò)。為了解決這個(gè)問(wèn)題,我編寫了一個(gè)VBA宏,它可以自動(dòng)為一個(gè)文件夾中的所有Word文檔設(shè)置連續(xù)的頁(yè)碼。本文將詳細(xì)介紹這個(gè)宏的工作原理和使用方法。
宏的功能
這個(gè)VBA宏的主要功能是:
- 允許用戶選擇一個(gè)文件夾,宏將遍歷該文件夾中的所有Word文檔(.docx格式)。
- 按該文件夾下的文檔順序,為每個(gè)文檔設(shè)置連續(xù)的頁(yè)碼,確保文檔之間沒有頁(yè)碼重復(fù)且頁(yè)碼不中斷。
- 通過(guò)一個(gè)輔助函數(shù)獲取每個(gè)文檔的總頁(yè)數(shù),并根據(jù)此信息更新下一個(gè)文檔的起始頁(yè)碼。
- 通過(guò)一個(gè)輔助函數(shù)為每個(gè)文檔第一節(jié)設(shè)置起始頁(yè)碼,后續(xù)節(jié)為續(xù)前節(jié),且不影響原始頁(yè)腳。
宏的實(shí)現(xiàn)
以下是宏的代碼實(shí)現(xiàn),包括兩個(gè)輔助函數(shù)和一個(gè)主過(guò)程。
主過(guò)程:a設(shè)置連續(xù)頁(yè)碼并遍歷文檔
Sub a設(shè)置連續(xù)頁(yè)碼并遍歷文檔()
' 定義變量用于存儲(chǔ)文件夾路徑
Dim strFolderPath As String
' 創(chuàng)建FileSystemObject對(duì)象,用于操作文件系統(tǒng)
Dim objFSO As Object
' 定義變量用于存儲(chǔ)文件夾對(duì)象
Dim objFolder As Object
' 定義變量用于存儲(chǔ)文件對(duì)象
Dim objFile As Object
' 定義變量用于存儲(chǔ)Word文檔對(duì)象
Dim objDoc As Document
' 定義變量用于存儲(chǔ)當(dāng)前頁(yè)碼
Dim iCurrentPage As Integer
' 定義變量用于存儲(chǔ)文檔的總頁(yè)數(shù)
Dim iTotalPages As Integer
' 定義變量用于存儲(chǔ)之前文檔的總頁(yè)數(shù),以便設(shè)置連續(xù)頁(yè)碼
Dim iPreviousTotal As Integer
' 創(chuàng)建FileSystemObject對(duì)象
Set objFSO = CreateObject("Scripting.FileSystemObject")
' 使用文件選擇對(duì)話框讓用戶選擇文件夾
With Application.FileDialog(msoFileDialogFolderPicker)
' 如果用戶選擇了文件夾
If .Show = -1 Then
' 存儲(chǔ)選擇的文件夾路徑
strFolderPath = .SelectedItems(1) & "\"
Else
' 如果用戶取消選擇,則顯示消息框并退出宏
MsgBox "未選擇文件夾,操作已取消。"
Exit Sub
End If
End With
' 根據(jù)用戶選擇的路徑獲取文件夾對(duì)象
Set objFolder = objFSO.GetFolder(strFolderPath)
' 初始化當(dāng)前頁(yè)碼為1
iCurrentPage = 1
' 遍歷文件夾中的所有.docx文件
For Each objFile In objFolder.Files
' 檢查文件擴(kuò)展名是否為docx
If LCase(objFSO.GetExtensionName(objFile.Name)) = "docx" Then
' 打開文檔,不顯示界面
Set objDoc = Documents.Open(objFile.Path, Visible:=False)
' 調(diào)用宏設(shè)置頁(yè)碼,傳入當(dāng)前頁(yè)碼
Call e自動(dòng)前節(jié)設(shè)置(objDoc, iCurrentPage)
' 調(diào)用輔助函數(shù)獲取當(dāng)前文檔的總頁(yè)數(shù)
iTotalPages = GetTotalPages(objDoc)
' 更新當(dāng)前頁(yè)碼為下一個(gè)文檔的起始頁(yè)碼
iPreviousTotal = iCurrentPage
iCurrentPage = iTotalPages + iPreviousTotal
' 保存并關(guān)閉文檔
objDoc.Close SaveChanges:=True
End If
Next objFile
' 顯示消息框,告知用戶所有文檔的頁(yè)碼設(shè)置完成
MsgBox "所有文檔的頁(yè)碼設(shè)置完成。"
End Sub
輔助函數(shù):GetTotalPages
' 輔助函數(shù),用于獲取文檔的總頁(yè)數(shù)
Function GetTotalPages(ByRef oDoc As Document) As Integer
' 獲取當(dāng)前文檔的總頁(yè)數(shù),返回給調(diào)用者
GetTotalPages = oDoc.Windows(1).Panes(1).Pages.Count
End Function
輔助函數(shù):e自動(dòng)前節(jié)設(shè)置
' 輔助函數(shù),用于設(shè)置文檔的頁(yè)碼
Sub e自動(dòng)前節(jié)設(shè)置(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編輯器。
- 插入一個(gè)新的模塊,并將上述代碼粘貼進(jìn)去。
- 運(yùn)行宏 a設(shè)置連續(xù)頁(yè)碼并遍歷文檔。
- 選擇包含Word文檔的文件夾。
- 宏將自動(dòng)為每個(gè)文檔設(shè)置連續(xù)頁(yè)碼,并在完成后彈出提示消息。
完整代碼
Sub a設(shè)置連續(xù)頁(yè)碼并遍歷文檔()
' 定義變量用于存儲(chǔ)文件夾路徑
Dim strFolderPath As String
' 創(chuàng)建FileSystemObject對(duì)象,用于操作文件系統(tǒng)
Dim objFSO As Object
' 定義變量用于存儲(chǔ)文件夾對(duì)象
Dim objFolder As Object
' 定義變量用于存儲(chǔ)文件對(duì)象
Dim objFile As Object
' 定義變量用于存儲(chǔ)Word文檔對(duì)象
Dim objDoc As Document
' 定義變量用于存儲(chǔ)當(dāng)前頁(yè)碼
Dim iCurrentPage As Integer
' 定義變量用于存儲(chǔ)文檔的總頁(yè)數(shù)
Dim iTotalPages As Integer
' 定義變量用于存儲(chǔ)之前文檔的總頁(yè)數(shù),以便設(shè)置連續(xù)頁(yè)碼
Dim iPreviousTotal As Integer
' 創(chuàng)建FileSystemObject對(duì)象
Set objFSO = CreateObject("Scripting.FileSystemObject")
' 使用文件選擇對(duì)話框讓用戶選擇文件夾
With Application.FileDialog(msoFileDialogFolderPicker)
' 如果用戶選擇了文件夾
If .Show = -1 Then
' 存儲(chǔ)選擇的文件夾路徑
strFolderPath = .SelectedItems(1) & "\"
Else
' 如果用戶取消選擇,則顯示消息框并退出宏
MsgBox "未選擇文件夾,操作已取消。"
Exit Sub
End If
End With
' 根據(jù)用戶選擇的路徑獲取文件夾對(duì)象
Set objFolder = objFSO.GetFolder(strFolderPath)
' 初始化當(dāng)前頁(yè)碼為1
iCurrentPage = 1
' 遍歷文件夾中的所有.docx文件
For Each objFile In objFolder.Files
' 檢查文件擴(kuò)展名是否為docx
If LCase(objFSO.GetExtensionName(objFile.Name)) = "docx" Then
' 打開文檔,不顯示界面
Set objDoc = Documents.Open(objFile.Path, Visible:=False)
' 調(diào)用宏設(shè)置頁(yè)碼,傳入當(dāng)前頁(yè)碼
Call e自動(dòng)前節(jié)設(shè)置(objDoc, iCurrentPage)
' 調(diào)用輔助函數(shù)獲取當(dāng)前文檔的總頁(yè)數(shù)
iTotalPages = GetTotalPages(objDoc)
' 更新當(dāng)前頁(yè)碼為下一個(gè)文檔的起始頁(yè)碼
iPreviousTotal = iCurrentPage
iCurrentPage = iTotalPages + iPreviousTotal
' 保存并關(guān)閉文檔
objDoc.Close SaveChanges:=True
End If
Next objFile
' 顯示消息框,告知用戶所有文檔的頁(yè)碼設(shè)置完成
MsgBox "所有文檔的頁(yè)碼設(shè)置完成。"
End Sub
' 輔助函數(shù),用于獲取文檔的總頁(yè)數(shù)
Function GetTotalPages(ByRef oDoc As Document) As Integer
' 獲取當(dāng)前文檔的總頁(yè)數(shù),返回給調(diào)用者
GetTotalPages = oDoc.Windows(1).Panes(1).Pages.Count
End Function
' 輔助函數(shù),用于設(shè)置文檔的頁(yè)碼
Sub e自動(dòng)前節(jié)設(shè)置(ByRef oDoc As Document, ByRef iStartingPage As Integer)
' 定義變量用于存儲(chǔ)文檔節(jié)對(duì)象
Dim oSection As Section
' 遍歷文檔的所有節(jié)
For Each oSection In oDoc.Sections
' 如果是第一個(gè)節(jié),則設(shè)置頁(yè)碼樣式和起始頁(yè)碼
If oSection.Index = 1 Then
With oSection.Footers(wdHeaderFooterPrimary).PageNumbers
' 設(shè)置頁(yè)碼樣式為阿拉伯?dāng)?shù)字
.NumberStyle = wdPageNumberStyleArabic
' 設(shè)置在該節(jié)重新開始頁(yè)碼編號(hào)
.RestartNumberingAtSection = True
' 設(shè)置起始頁(yè)碼
.StartingNumber = iStartingPage
End With
Else
' 對(duì)于其他節(jié),不重新開始頁(yè)碼編號(hào)
With oSection.Footers(wdHeaderFooterPrimary).PageNumbers
.RestartNumberingAtSection = False
End With
End If
Next oSection
End Sub注意事項(xiàng)
- 確保所有文檔都是Word文檔(.docx格式)。
- 宏在設(shè)置頁(yè)碼時(shí)不會(huì)更改文檔的內(nèi)容。
- 如果文件夾中包含非Word文檔,宏將忽略這些文件。
到此這篇關(guān)于Python實(shí)現(xiàn)在多個(gè)Word文檔中一鍵搜索的文章就介紹到這了,更多相關(guān)Python多個(gè)Word一鍵搜索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python Pillow 圖像處理庫(kù)詳解(常用Pillow函數(shù)及其參數(shù))
Pillow,原名PIL(Python Imaging Library),是一個(gè)功能強(qiáng)大的Python圖像處理庫(kù),支持多種格式,提供豐富的圖像操作功能,如旋轉(zhuǎn)、縮放、顏色轉(zhuǎn)換等,以及易于使用的API,Pillow支持廣泛的圖像文件格式,并提供圖像過(guò)濾、繪制等功能2024-09-09
Python Socket實(shí)現(xiàn)簡(jiǎn)單TCP Server/client功能示例
這篇文章主要介紹了Python Socket實(shí)現(xiàn)簡(jiǎn)單TCP Server/client功能,結(jié)合實(shí)例形式分析了Python基于socket創(chuàng)建TCP服務(wù)器Server與客戶端client相關(guān)實(shí)現(xiàn)步驟與操作技巧,需要的朋友可以參考下2017-08-08
Python實(shí)現(xiàn)Opencv cv2.Canny()邊緣檢測(cè)
這篇博客將介紹Canny邊緣檢測(cè)的概念,并利用cv2.Canny()實(shí)現(xiàn)邊緣檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
python3使用smtplib實(shí)現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了python3使用smtplib實(shí)現(xiàn)發(fā)送郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作
這篇文章主要介紹了pytorch finetuning 自己的圖片進(jìn)行訓(xùn)練操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
python 使用GDAL實(shí)現(xiàn)柵格tif轉(zhuǎn)矢量shp的方式小結(jié)
今天通過(guò)本文給大家分享python 使用GDAL實(shí)現(xiàn)柵格tif轉(zhuǎn)矢量shp的方式小結(jié),計(jì)劃是使用柵格轉(zhuǎn)矢量的方式,將柵格數(shù)據(jù)轉(zhuǎn)為矢量shp文件,然后進(jìn)行矢量切片,使用Mapbox進(jìn)行前端動(dòng)態(tài)渲染,具體內(nèi)容詳情跟隨小編一起看看吧2021-08-08

