基于PyQt5自制簡單的文件內(nèi)容檢索小工具
好久沒有更新過PyQt5相關(guān)的專題了,今天正好有空就做一個(gè)文件、文件內(nèi)容檢索的小工具。
目的是為了能夠很快的完成的在任意磁盤路徑下找到我們需要的文件、或是包含某關(guān)鍵詞內(nèi)容的文件。

實(shí)現(xiàn)過程依舊是采用我們比較熟悉的PyQt5來完成應(yīng)用程序的制作,接下來直接進(jìn)入正題。
有新來的小伙伴沒有安裝PyQt5的小伙伴可以選擇pip或其他的方式安裝該模塊。
pip?install?PyQt5?-i?https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
下面我們先可以制作一個(gè)PyQt5的UI界面,創(chuàng)建一個(gè)FileSearchUI類,將UI界面布局、組件及相關(guān)的槽函數(shù)都放到這個(gè)類中來開發(fā)。
#?導(dǎo)入PyQt5.QtGui模塊
from?PyQt5.QtGui?import?*
#?導(dǎo)入PyQt5.QtCore模塊
from?PyQt5.QtCore?import?*
#?導(dǎo)入PyQt5.QtWidgets模塊
from?PyQt5.QtWidgets?import?*
#?系統(tǒng)處理模塊
import?sys
#?文件處理操作模塊
import?os
#?導(dǎo)入異常處理模塊
import?traceback
#?正則表達(dá)式匹配模塊
import?re
import?images
class?FileSearchUI(QWidget):
????def?__init__(self):
????????super(FileSearchUI,?self).__init__()
????????self.resize(600,?400)
????????self.setWindowTitle('文件內(nèi)容檢索器?公眾號(hào):Python 集中營')
????????self.setWindowIcon(QIcon(':/analysis.ico'))
????????self.target_search_dir?=?QLineEdit()
????????self.target_search_dir.setPlaceholderText('目標(biāo)搜索目錄')
????????self.target_search_dir.setReadOnly(True)
????????self.target_search_btn?=?QPushButton()
????????self.target_search_btn.setText('瀏覽')
????????self.target_search_btn.clicked.connect(self.target_search_btn_clk)
????????self.search_text?=?QLineEdit()
????????self.search_text.setPlaceholderText('請(qǐng)輸入搜索內(nèi)容...')
????????self.search_btn?=?QPushButton()
????????self.search_btn.setText('開始搜索')
????????self.search_btn.clicked.connect(self.search_btn_clk)
????????self.brower?=?QTextBrowser()
????????self.brower.setReadOnly(True)
????????self.brower.setFont(QFont('宋體',?8))
????????self.brower.setPlaceholderText('日志處理過程區(qū)域...')
????????self.brower.ensureCursorVisible()
????????grid?=?QGridLayout()
????????grid.addWidget(self.target_search_dir,?0,?0,?1,?2)
????????grid.addWidget(self.target_search_btn,?0,?2,?1,?1)
????????grid.addWidget(self.search_text,?1,?0,?1,?3)
????????grid.addWidget(self.search_btn,?2,?0,?1,?3)
????????grid.addWidget(self.brower,?3,?0,?1,?3)
????????self.thread_?=?WorkThread(self)
????????self.thread_.message.connect(self.show_message)
????????self.thread_.finished.connect(self.finished)
????????self.setLayout(grid)
????def?show_message(self,?text):
????????cursor?=?self.brower.textCursor()
????????cursor.movePosition(QTextCursor.End)
????????self.brower.append(text)
????????self.brower.setTextCursor(cursor)
????????self.brower.ensureCursorVisible()
????def?target_search_btn_clk(self):
????????target_path?=?QFileDialog.getExistingDirectory(self,?'選擇文件夾',?os.getcwd())
????????self.target_search_dir.setText(target_path)
????def?search_btn_clk(self):
????????self.thread_.start()
????????self.search_btn.setEnabled(False)
????def?finished(self,?text):
????????if?text?is?True:
????????????self.search_btn.setEnabled(True)
至此,我們已經(jīng)完成了檢索小工具應(yīng)用的UI界面的布局、組件以及相關(guān)的槽函數(shù)的事件點(diǎn)擊操作。
該應(yīng)用的UI界面展示效果如下:

上述代碼塊已經(jīng)實(shí)現(xiàn)了應(yīng)用的界面功能,下面就是業(yè)務(wù)邏輯的實(shí)現(xiàn)了,通常為了不影響主線程的運(yùn)行都會(huì)使用專門的子線程來執(zhí)行業(yè)務(wù)邏輯。
這里我們創(chuàng)建一個(gè)繼承自QThread的WorkThread類用于實(shí)現(xiàn)文件內(nèi)容檢索的真正功能。
import?chardet
from?chardet.universaldetector?import?UniversalDetector
class?WorkThread(QThread):
????finished?=?pyqtSignal(bool)
????message?=?pyqtSignal(str)
????def?__init__(self,?parent=None):
????????super(WorkThread,?self).__init__(parent)
????????self.parent?=?parent
????????self.working?=?True
????def?__del__(self):
????????self.working?=?True
????def?run(self):
????????try:
????????????target_search_dir?=?self.parent.target_search_dir.text().strip()
????????????search_text?=?self.parent.search_text.text().strip()
????????????if?target_search_dir?==?'':
????????????????self.message.emit('目標(biāo)檢索路徑不能為空!')
????????????elif?search_text?==?'':
????????????????self.message.emit('檢索內(nèi)容不能為空!')
????????????self.message.emit('已設(shè)置目標(biāo)檢索路徑:')
????????????self.message.emit(target_search_dir)
????????????self.message.emit('已設(shè)置檢索內(nèi)容:')
????????????self.message.emit(search_text)
????????????file_name_con_list?=?[]
????????????file_current_list?=?[]
????????????for?dirpath,?dirnames,?filenames?in?os.walk(target_search_dir):
????????????????for?filename?in?filenames:
????????????????????if?search_text?in?filename:
????????????????????????if?os.path.join(dirpath,?filename)?not?in?file_name_con_list:
????????????????????????????file_name_con_list.append(os.path.join(dirpath,?filename))
????????????????????detector?=?UniversalDetector()
????????????????????with?open(os.path.join(dirpath,?filename),?'rb')?as?f:
????????????????????????for?line?in?f:
????????????????????????????detector.feed(line)
????????????????????????????if?detector.done:
????????????????????????????????break
????????????????????????detector.close()
????????????????????????if?detector.result['encoding']?is?not?None?and?detector.result['encoding']?==?'utf-8':
????????????????????????????current_?=?f.read().decode('utf-8')
????????????????????????????if?search_text?in?current_:
????????????????????????????????file_current_list.append(os.path.join(dirpath,?filename))
????????????self.message.emit('文件名稱包含關(guān)鍵字的文件路徑:')
????????????self.message.emit('\n'.join(file_name_con_list))
????????????self.message.emit('文件內(nèi)容包含關(guān)鍵字的文件路徑:')
????????????self.message.emit('\n'.join(file_current_list))
????????????self.message.emit('文件內(nèi)容檢索全部完成!')
????????????self.finished.emit(True)
????????except:
????????????traceback.print_exc()
????????????self.message.emit('程序運(yùn)行錯(cuò)誤,請(qǐng)檢查參數(shù)設(shè)置是否正常!')
????????????self.finished.emit(True)
如上述WorkThread類的代碼塊就是全部的業(yè)務(wù)實(shí)現(xiàn)邏輯,我們?cè)谧x取文件判斷時(shí)使用的二進(jìn)制的文件讀取方式。
之后,將二進(jìn)制的字符串解碼成utf-8的文本字符串再進(jìn)行搜索匹配并將文件路徑發(fā)送到主線程的UI界面日志中。
最后則使用python模塊的main函數(shù)將整個(gè)應(yīng)用完成啟動(dòng)即可。
if?__name__?==?'__main__': ????app?=?QApplication(sys.argv) ????main?=?FileSearchUI() ????main.show() ????sys.exit(app.exec_())
下面檢索小工具在搜索過程的運(yùn)行效果展示:

小伙伴們可以將上述所有源代碼復(fù)制到自己的開發(fā)工具中或打包成exe應(yīng)用程序即可成功啟動(dòng)應(yīng)用。
到此這篇關(guān)于基于PyQt5自制簡單的文件內(nèi)容檢索小工具的文章就介紹到這了,更多相關(guān)PyQt5文件內(nèi)容檢索工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3+selenium獲取頁面加載的所有靜態(tài)資源文件鏈接操作
這篇文章主要介紹了python3+selenium獲取頁面加載的所有靜態(tài)資源文件鏈接操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python基于Socket實(shí)現(xiàn)的簡單聊天程序示例
這篇文章主要介紹了Python基于Socket實(shí)現(xiàn)的簡單聊天程序,結(jié)合簡單實(shí)例形式分析了Python聊天程序的客戶端與服務(wù)器端相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08
python 實(shí)現(xiàn)tar文件壓縮解壓的實(shí)例詳解
這篇文章主要介紹了python 實(shí)現(xiàn)tar文件壓縮解壓的實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)方法,幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08
實(shí)例分析python3實(shí)現(xiàn)并發(fā)訪問水平切分表
在本文中小編給大家整理了關(guān)于python3實(shí)現(xiàn)并發(fā)訪問水平切分表的相關(guān)知識(shí)點(diǎn)以及實(shí)例代碼,有興趣的朋友們參考下。2018-09-09
Python基礎(chǔ)之?dāng)?shù)據(jù)類型詳解
python的數(shù)值類型包括整數(shù),浮點(diǎn)數(shù),復(fù)數(shù),集合,小數(shù)和分?jǐn)?shù),布爾值.它們都是python中的數(shù)值類型.如果是有過其他語言編寫經(jīng)驗(yàn)的人,一定很好奇,浮點(diǎn)數(shù)和小數(shù)的區(qū)別是什么?文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06
python實(shí)現(xiàn)基本進(jìn)制轉(zhuǎn)換的方法
這篇文章主要介紹了python實(shí)現(xiàn)基本進(jìn)制轉(zhuǎn)換的方法,涉及Python數(shù)學(xué)運(yùn)算的取余與字符串操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07

