写点什么

使用 python 实现一个文件搜索功能, 类似于 Everything 功能

作者:技能实验室
  • 2022-10-19
    河南
  • 本文字数:1387 字

    阅读完需:约 1 分钟

使用python实现一个文件搜索功能,类似于Everything功能

一般人日常总是会将一些片段信息记录到文件中,放到电脑硬盘上。等过段时间,可能就不知道放到哪里了,电脑上文件夹太多。 找文件一般都会借助于搜索软件,比如 Everything 软件就很强大,输入名称,就能全局查找文件;


但是 Everyting 软件只能匹配文件内,如果想搜索的是文件内容,就没办法了。不知道市面上有没有这样的软件?


不过,可以使用 python 做一个简单的搜索功能,实现这个需求;

实现原理

  • 使用 os 遍历文件夹下所以文件

  • 使用内置 open 函数读取文件内容并搜索匹配

  • 为了提供速度,加一个多线程执行方法

准备工作

需要用到库中只有多线程库 threading 是第三方库,需要安装;安装方式比较简单,打开命令行窗口;执行命令:


pip install threading


等待安装成功;


多线程基础知识进程是应用程序的执行实例。每一个运行中的程序就是一个进程。线程是进程的组成部分,一个进程可以拥有多个线程。在多线程中,会有一个主线程来完成整个进程从开始到结束的全部操作,而其他的线程会在主线程的运行过程中被创建或退出。


并发和并行


并发和并行是两个概念,并行指在同一时刻有多条指令在多个处理器上同时执行;并发是指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。


使用 threading 创建线程的两种方式:


使用 threading 模块中 Thread 类的构造器创建线程。即直接对类 threading.Thread 进行实例化创建线程,并调用实例化对象的 start() 方法启动线程。继承 threading 模块中的 Thread 类创建线程类。即用 threading.Thread 派生出一个新的子类,将新建类实例化创建线程,并调用其 start() 方法启动线程。

具体实现

  1. 编码内容搜索函数:输入文件路径,读取文件内容匹配给定搜索词;


 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}')
复制代码


  1. 编码文件遍历方法:使用 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)
复制代码


以上就是一个简单的实现,仅供参考!

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2022-07-26 加入

还未添加个人简介

评论

发布
暂无评论
使用python实现一个文件搜索功能,类似于Everything功能_Python_技能实验室_InfoQ写作社区