基于PyQt5自制简单的文件内容检索小工具
作者:Python 发布时间:2023-06-11 19:45:03
标签:PyQt5,检索,工具
好久没有更新过PyQt5相关的专题了,今天正好有空就做一个文件、文件内容检索的小工具。
目的是为了能够很快的完成的在任意磁盘路径下找到我们需要的文件、或是包含某关键词内容的文件。
实现过程依旧是采用我们比较熟悉的PyQt5来完成应用程序的制作,接下来直接进入正题。
有新来的小伙伴没有安装PyQt5的小伙伴可以选择pip或其他的方式安装该模块。
pip install PyQt5 -i https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
下面我们先可以制作一个PyQt5的UI界面,创建一个FileSearchUI类,将UI界面布局、组件及相关的槽函数都放到这个类中来开发。
# 导入PyQt5.QtGui模块
from PyQt5.QtGui import *
# 导入PyQt5.QtCore模块
from PyQt5.QtCore import *
# 导入PyQt5.QtWidgets模块
from PyQt5.QtWidgets import *
# 系统处理模块
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('文件内容检索器 公众号: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('请输入搜索内容...')
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('日志处理过程区域...')
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)
至此,我们已经完成了检索小工具应用的UI界面的布局、组件以及相关的槽函数的事件点击操作。
该应用的UI界面展示效果如下:
上述代码块已经实现了应用的界面功能,下面就是业务逻辑的实现了,通常为了不影响主线程的运行都会使用专门的子线程来执行业务逻辑。
这里我们创建一个继承自QThread的WorkThread类用于实现文件内容检索的真正功能。
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('检索内容不能为空!')
self.message.emit('已设置目标检索路径:')
self.message.emit(target_search_dir)
self.message.emit('已设置检索内容:')
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('文件名称包含关键字的文件路径:')
self.message.emit('\n'.join(file_name_con_list))
self.message.emit('文件内容包含关键字的文件路径:')
self.message.emit('\n'.join(file_current_list))
self.message.emit('文件内容检索全部完成!')
self.finished.emit(True)
except:
traceback.print_exc()
self.message.emit('程序运行错误,请检查参数设置是否正常!')
self.finished.emit(True)
如上述WorkThread类的代码块就是全部的业务实现逻辑,我们在读取文件判断时使用的二进制的文件读取方式。
之后,将二进制的字符串解码成utf-8的文本字符串再进行搜索匹配并将文件路径发送到主线程的UI界面日志中。
最后则使用python模块的main函数将整个应用完成启动即可。
if __name__ == '__main__':
app = QApplication(sys.argv)
main = FileSearchUI()
main.show()
sys.exit(app.exec_())
下面检索小工具在搜索过程的运行效果展示:
小伙伴们可以将上述所有源代码复制到自己的开发工具中或打包成exe应用程序即可成功启动应用。
来源:https://mp.weixin.qq.com/s/as6LrERS3egAx41ELxj6eQ
0
投稿
猜你喜欢
- 一个申请单可以包含N个项目,添加申请单时就需要动态加入代码了。 动态Table表格 <table border="0&quo
- 这次我们讨论的是,区分有单选框的选项和普通的选项~~乍听起来,可能不太理解我说了什么,下面举个例子先~~1、标签的单选~~例如QQ秀的支付流
- 先不说直接改后缀,直接可以用网快等工具直接下载,其实这样你已经是为入侵者打开了大门。入侵者可以利用asp/asa为后缀的数据库直接得到web
- 做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的。这个表的数据是千万级的,而
- 在使用DB2以来,碰到了几次出现提示SQL1032N错误,每次出错时出错信息大概如下:11/21/2004 22:15:33 0 0 SQL
- 写任何编程代码,不同的开发者都会有不同的见解。但参考一下总是好的,下面是来自 Javascript Toolbox 发布的 14条最佳JS代
- python 与 C++ dlib人脸检测结果对比,供大家参考,具体内容如下说明:由于项目需求发现Linux下c++使用dlib进行人脸检测
- 最近网上流行着一些采集程序,更多人拿着这些东西在网上叫卖,很多不太懂的人看着那些程序眼羡,其实如果你懂一些ASP,了解自动采集程序的原理后,
- 1. PHP入侵检测系统PHP IDS(即PHP-入侵检测系统)是一套易于使用、结构良好、速度出色且专门面向PHP类Web应用程序的先进安全
- 在Perfection kills上看到他去年写的一篇文章,关于HTML优化的,讲的很详细,姑且记录之,尽管里面有些东西并不能在目前的环境里
- 要想更好的理解 css, 尤其是 IE 下对 css 的渲染,haslayout 是一个非常有必要彻底弄清除的概念。大多IE下的显示错误,就
- 在SQL查询中,关键词Like可提供模糊查询功能,它通常与通配符一起使用。1 Like条件适用数据库字段类型 &nbs
- asp之家注:对于ACCESS数据库中的NULL,经常我们直接判断该字段是否为空用的是:name="",但是这个还不够,
- FLV在线转换,是目前主流播客网上通用的一种视频解决方案需要用到的组件 ASPExecmencoderffmpeg.exe第一步骤: 在线转
- 摘 要: 恢复丢失的数据库文件在很大程度上取决于所采用的备份策略。本文从恢复的灵活性出发,对Oracle8数据库的备份及恢复策略进行了探讨,
- 如题:我写入关键字到数据库,多的时候用|隔开了,我提取再做相关文章搜索的时候,我怎么提取用|隔开的文字啊,这样我就好用关键字做搜索啊 回复:
- 最近一个项目中遇到ASP对FoxPro库表(*.DBF)的操作问题。现实中确有许多应用软件使
- WinHttp; // Microsoft WinHTTP Services, version 5.1Alias HTTPREQUEST_P
- 今天要做个搜索,用到了时间比较函数!以前多是直接比较时间,查询语句有长效率又不高~~~后来用了DateDiff函数,在调试的时候发现了一些问
- 内容摘要:本文介绍了使用SQL语句修改数据记录的两种方法,一是使用rs.update,二是使用conn.Execute(sql),相信对初学