一般人日常总是会将一些片段信息记录到文件中,放到电脑硬盘上。等过段时间,可能就不知道放到哪里了,电脑上文件夹太多。 找文件一般都会借助于搜索软件,比如Everything软件就很强大,输入名称,就能全局查找文件;
但是Everyting软件只能匹配文件内,如果想搜索的是文件内容,就没办法了。不知道市面上有没有这样的软件?
不过,可以使用python做一个简单的搜索功能,实现这个需求;
实现原理
- 使用os遍历文件夹下所以文件
- 使用内置open函数读取文件内容并搜索匹配
- 为了提供速度,加一个多线程执行方法
准备工作
需要用到库中只有多线程库threading是第三方库,需要安装;安装方式比较简单,打开命令行窗口;执行命令:
pip install threading
等待安装成功;
多线程基础知识
进程是应用程序的执行实例。每一个运行中的程序就是一个进程。
线程是进程的组成部分,一个进程可以拥有多个线程。在多线程中,会有一个主线程来完成整个进程从开始到结束的全部操作,而其他的线程会在主线程的运行过程中被创建或退出。
并发和并行
并发和并行是两个概念,并行指在同一时刻有多条指令在多个处理器上同时执行;并发是指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。
使用threading 创建线程的两种方式:
使用 threading 模块中 Thread 类的构造器创建线程。即直接对类 threading.Thread 进行实例化创建线程,并调用实例化对象的 start() 方法启动线程。
继承 threading 模块中的 Thread 类创建线程类。即用 threading.Thread 派生出一个新的子类,将新建类实例化创建线程,并调用其 start() 方法启动线程。
具体实现
编码内容搜索函数:
输入文件路径, 读取文件内容 匹配给定搜索词;
def findTask( path_name):
print(f'正在查找 {path_name}')
f = open(path_name, "r",encoding='utf-8')
#打开文件,只读模式
try:
#判断搜索关键字是否在文件内容中
if str_text in f.read():
#搜索到添加到结果中,后续输出展示
results.append(f'{str_text} found in {path_name} = content')
except UnicodeDecodeError:
print(f'解析错误 {path_name}')
2. **编码文件遍历方法:**
使用 os.listdir(dir_path)函数获取文件夹下所有文件
对子文件夹进行递归调用
对文件先进行文件名匹配,
files = os.listdir(dir_path)
for name in files:
path_name = os.path.join(dir_path, name)
if os.path.isdir(path_name):
search_files(path_name)
if str_text in path_name:
results.append(f'{str_text} found in {path_name} == name')
获取文件信息,主要包括后缀名,大小等,判断是否进行后续操作
对于小文件,可以直接进行处理,大文件放到线程中进行
file_proc = threading.Thread(target=findTask, args=(path_name,))
file_proc.start()
threads.append(file_proc)
### 编码运行函数
主要是对线程调用join方法
并打印最终搜索结果
ef run():
search_files(path)
for thr in threads:
thr.join()
#等待所以线程结束
if len(results) == 0:
print(str_text + " not found! ")
else:
for res in results:
print(res)