基于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)文章
python 如何將帶小數(shù)的浮點(diǎn)型字符串轉(zhuǎn)換為整數(shù)
在python中如何實(shí)現(xiàn)將帶小數(shù)的浮點(diǎn)型字符串轉(zhuǎn)換為整數(shù)呢?今天小編就為大家介紹一下解決方案,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05對(duì)tensorflow 中tile函數(shù)的使用詳解
今天小編就為大家分享一篇對(duì)tensorflow 中tile函數(shù)的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python使用正則實(shí)現(xiàn)計(jì)算字符串算式
這篇文章主要介紹了Python使用正則實(shí)現(xiàn)計(jì)算字符串算式的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Python網(wǎng)絡(luò)爬蟲神器PyQuery的基本使用教程
這篇文章主要給大家介紹了關(guān)于Python網(wǎng)絡(luò)爬蟲神器PyQuery的基本使用教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)使用PyQuery具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02Python進(jìn)行ffmpeg推流和拉流rtsp、rtmp實(shí)例詳解
Python推流本質(zhì)是調(diào)用FFmpeg的推流進(jìn)程,下面這篇文章主要給大家介紹了關(guān)于Python進(jìn)行ffmpeg推流和拉流rtsp、rtmp的相關(guān)資料,需要的朋友可以參考下2023-01-01用python實(shí)現(xiàn)操縱mysql數(shù)據(jù)庫插入
大家好,本篇文章主要講的是用python實(shí)現(xiàn)操縱mysql數(shù)據(jù)庫插入,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01對(duì)Python中Iterator和Iterable的區(qū)別詳解
今天小編就為大家分享一篇對(duì)Python中Iterator和Iterable的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10