使用python实现一个文件搜索功能

164 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

一般人日常总是会将一些片段信息记录到文件中,放到电脑硬盘上。等过段时间,可能就不知道放到哪里了,电脑上文件夹太多。 找文件一般都会借助于搜索软件,比如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)

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