基于PyQt5自制簡單的文件內(nèi)容檢索小工具
好久沒有更新過PyQt5相關(guān)的專題了,今天正好有空就做一個文件、文件內(nèi)容檢索的小工具。
目的是為了能夠很快的完成的在任意磁盤路徑下找到我們需要的文件、或是包含某關(guān)鍵詞內(nèi)容的文件。
實現(xiàn)過程依舊是采用我們比較熟悉的PyQt5來完成應(yīng)用程序的制作,接下來直接進入正題。
有新來的小伙伴沒有安裝PyQt5的小伙伴可以選擇pip或其他的方式安裝該模塊。
pip?install?PyQt5?-i?https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
下面我們先可以制作一個PyQt5的UI界面,創(chuàng)建一個FileSearchUI類,將UI界面布局、組件及相關(guān)的槽函數(shù)都放到這個類中來開發(fā)。
#?導入PyQt5.QtGui模塊 from?PyQt5.QtGui?import?* #?導入PyQt5.QtCore模塊 from?PyQt5.QtCore?import?* #?導入PyQt5.QtWidgets模塊 from?PyQt5.QtWidgets?import?* #?系統(tǒng)處理模塊 import?sys #?文件處理操作模塊 import?os #?導入異常處理模塊 import?traceback #?正則表達式匹配模塊 import?re import?images class?FileSearchUI(QWidget): ????def?__init__(self): ????????super(FileSearchUI,?self).__init__() ????????self.resize(600,?400) ????????self.setWindowTitle('文件內(nèi)容檢索器?公眾號:Python 集中營') ????????self.setWindowIcon(QIcon(':/analysis.ico')) ????????self.target_search_dir?=?QLineEdit() ????????self.target_search_dir.setPlaceholderText('目標搜索目錄') ????????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('請輸入搜索內(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ù)的事件點擊操作。
該應(yīng)用的UI界面展示效果如下:
上述代碼塊已經(jīng)實現(xiàn)了應(yīng)用的界面功能,下面就是業(yè)務(wù)邏輯的實現(xiàn)了,通常為了不影響主線程的運行都會使用專門的子線程來執(zhí)行業(yè)務(wù)邏輯。
這里我們創(chuàng)建一個繼承自QThread的WorkThread類用于實現(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('目標檢索路徑不能為空!') ????????????elif?search_text?==?'': ????????????????self.message.emit('檢索內(nèi)容不能為空!') ????????????self.message.emit('已設(shè)置目標檢索路徑:') ????????????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('程序運行錯誤,請檢查參數(shù)設(shè)置是否正常!') ????????????self.finished.emit(True)
如上述WorkThread類的代碼塊就是全部的業(yè)務(wù)實現(xiàn)邏輯,我們在讀取文件判斷時使用的二進制的文件讀取方式。
之后,將二進制的字符串解碼成utf-8的文本字符串再進行搜索匹配并將文件路徑發(fā)送到主線程的UI界面日志中。
最后則使用python模塊的main函數(shù)將整個應(yīng)用完成啟動即可。
if?__name__?==?'__main__': ????app?=?QApplication(sys.argv) ????main?=?FileSearchUI() ????main.show() ????sys.exit(app.exec_())
下面檢索小工具在搜索過程的運行效果展示:
小伙伴們可以將上述所有源代碼復制到自己的開發(fā)工具中或打包成exe應(yīng)用程序即可成功啟動應(yīng)用。
到此這篇關(guān)于基于PyQt5自制簡單的文件內(nèi)容檢索小工具的文章就介紹到這了,更多相關(guān)PyQt5文件內(nèi)容檢索工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 如何將帶小數(shù)的浮點型字符串轉(zhuǎn)換為整數(shù)
在python中如何實現(xiàn)將帶小數(shù)的浮點型字符串轉(zhuǎn)換為整數(shù)呢?今天小編就為大家介紹一下解決方案,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05Python網(wǎng)絡(luò)爬蟲神器PyQuery的基本使用教程
這篇文章主要給大家介紹了關(guān)于Python網(wǎng)絡(luò)爬蟲神器PyQuery的基本使用教程,文中通過示例代碼介紹的非常詳細,對大家學習使用PyQuery具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-02-02Python進行ffmpeg推流和拉流rtsp、rtmp實例詳解
Python推流本質(zhì)是調(diào)用FFmpeg的推流進程,下面這篇文章主要給大家介紹了關(guān)于Python進行ffmpeg推流和拉流rtsp、rtmp的相關(guān)資料,需要的朋友可以參考下2023-01-01用python實現(xiàn)操縱mysql數(shù)據(jù)庫插入
大家好,本篇文章主要講的是用python實現(xiàn)操縱mysql數(shù)據(jù)庫插入,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01對Python中Iterator和Iterable的區(qū)別詳解
今天小編就為大家分享一篇對Python中Iterator和Iterable的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10