Python 调用 Everything 进行查找文件

本文介绍了如何在Python中调用Everything搜索引擎进行文件查找。首先,需要开启Everything的Http服务器配置,然后通过requests.get()发送请求。文章通过遍历响应获取文件的名称和路径信息,实现了与PyQT结合的文件搜索功能。

最近自己用一些Pyqt的小组件进行文件搜索,需要调用Everything的接口,总结一下自己的使用方法。

Everything 配置

首先需要打开Everthing 的Http服务器配置,只需要启动该配置并记住端口号即可,配置方式:打开everything-工具-选项-Http服务器,无需设置用户名和密码

 输入网址:ip+:+端口号,能够打开everthing搜索即可

 配置完成后即可使用爬虫进行文件搜寻,我这里使用的是requests.get()

    def findit(self, line, ip):
        request = requests.get("http://" + ip + "/?search=" + line.currentText())
        content = request.text
        # print(content)
        soup = BeautifulSoup(content, 'lxml')
        items = soup.find_all("tr", {'class': 'trdata1'})
        title = []
        source = []
        if items:

            for i in range(len(items)):
                filename = 
<think>我们使用Python结合Everything实现一个带有文本框的图形界面文件搜索工具。这里选择使用Tkinter作为GUI库,因为它简单且内置于Python标准库中。 我们将采用Everything命令行工具(es.exe)的方式,因为它简单直接。用户需要在系统中安装Everything并确保es.exe在系统PATH中(或指定路径)。 步骤: 1. 导入必要的库:tkinter用于GUI,subprocess用于调用Everything命令行工具。 2. 创建主窗口,包含一个输入框(用于输入搜索关键字)、一个搜索按钮和一个结果列表框。 3. 当用户点击搜索按钮或按回车键时,触发搜索函数,该函数调用es.exe并获取结果,然后显示在列表框中。 4. 双击结果列表中的文件可以打开该文件(使用系统默认程序)。 注意:为了确保Everything命令行工具可用,我们先检查es.exe是否在PATH中,否则尝试从Everything安装目录中寻找(默认安装路径)。 引用: [^1]: Everything是voidtools开发的一款文件搜索工具,它体积小巧,启动迅速,界面简洁易用。搜索文件时快速建立索引,快速搜索,同时占用极低的系统资源,还能实时跟踪文件变化。其搜索速度比Windows自带的搜索要快得多。 我们将按照以下步骤编写代码: 1. 创建GUI界面 2. 实现搜索功能 3. 实现打开文件功能 代码实现如下: </think># PythonEverything集成:构建图形化文件搜索工具 下面我将演示如何结合PythonEverything工具,创建一个带有文本框的可视化文件搜索工具。这个工具能够实时搜索文件,并在图形界面中展示结果。 ## 完整实现代码 ```python import tkinter as tk from tkinter import ttk, messagebox import subprocess import os import threading class EverythingSearcher: def __init__(self, root): self.root = root self.root.title("Everything文件搜索工具") self.root.geometry("800x600") self.root.iconbitmap(self.get_icon_path()) # 设置窗口图标 # 创建UI组件 self.create_widgets() # 验证Everything安装 if not self.check_everything_installed(): messagebox.showerror("错误", "未找到Everything.exe!\n请确保已安装Everything并添加到系统PATH") def get_icon_path(self): """尝试获取Everything图标路径""" possible_paths = [ os.path.join(os.getenv("ProgramFiles"), "Everything", "Everything.exe"), os.path.join(os.getenv("ProgramFiles(x86)"), "Everything", "Everything.exe"), r"C:\Program Files\Everything\Everything.exe" ] for path in possible_paths: if os.path.exists(path): return path return None def check_everything_installed(self): """检查Everything是否可用""" try: result = subprocess.run(['es.exe', '-version'], capture_output=True, text=True, creationflags=subprocess.CREATE_NO_WINDOW) return result.returncode == 0 except FileNotFoundError: return False def create_widgets(self): """创建界面组件""" # 搜索框区域 search_frame = ttk.Frame(self.root, padding=10) search_frame.pack(fill=tk.X) ttk.Label(search_frame, text="搜索条件:").grid(row=0, column=0, padx=5) self.search_var = tk.StringVar() self.search_entry = ttk.Entry(search_frame, textvariable=self.search_var, width=50) self.search_entry.grid(row=0, column=1, padx=5) self.search_entry.bind('<Return>', lambda event: self.start_search()) # 搜索按钮 search_btn = ttk.Button(search_frame, text="搜索", command=self.start_search) search_btn.grid(row=0, column=2, padx=5) # 结果数量标签 self.result_count = ttk.Label(search_frame, text="找到 0 个文件") self.result_count.grid(row=0, column=3, padx=10) # 结果列表 result_frame = ttk.Frame(self.root) result_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10)) columns = ('name', 'path', 'size', 'modified') self.result_tree = ttk.Treeview(result_frame, columns=columns, show="headings") # 设置列标题 self.result_tree.heading('name', text="文件名", command=lambda: self.sort_column('name', False)) self.result_tree.heading('path', text="路径", command=lambda: self.sort_column('path', False)) self.result_tree.heading('size', text="大小", command=lambda: self.sort_column('size', False)) self.result_tree.heading('modified', text="修改时间", command=lambda: self.sort_column('modified', False)) # 设置列宽 self.result_tree.column('name', width=200) self.result_tree.column('path', width=350) self.result_tree.column('size', width=100) self.result_tree.column('modified', width=150) # 添加双击打开事件 self.result_tree.bind('<Double-1>', self.open_selected_file) # 添加滚动条 scrollbar = ttk.Scrollbar(result_frame, orient=tk.VERTICAL, command=self.result_tree.yview) self.result_tree.configure(yscroll=scrollbar.set) scrollbar.pack(side=tk.RIGHT, fill=tk.Y) self.result_tree.pack(fill=tk.BOTH, expand=True) # 状态栏 self.status_var = tk.StringVar() self.status_var.set("就绪") status_bar = ttk.Label(self.root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W) status_bar.pack(side=tk.BOTTOM, fill=tk.X) def start_search(self): """开始搜索操作""" query = self.search_var.get().strip() if not query: messagebox.showwarning("警告", "请输入搜索条件") return # 清空当前结果 self.result_tree.delete(*self.result_tree.get_children()) self.result_count.config(text="搜索中...") self.status_var.set(f"正在搜索: {query}...") # 在新线程中执行搜索 threading.Thread(target=self.perform_search, args=(query,), daemon=True).start() def perform_search(self, query): """执行Everything搜索""" try: # 使用Everything命令行工具搜索 cmd = f'es.exe -n 500 "{query}"' result = subprocess.run(cmd, capture_output=True, text=True, shell=True, creationflags=subprocess.CREATE_NO_WINDOW) if result.returncode == 0: file_paths = [path.strip() for path in result.stdout.split('\n') if path.strip()] # 更新UI显示结果 self.root.after(0, self.display_results, file_paths) self.root.after(0, lambda: self.status_var.set(f"完成搜索: {len(file_paths)} 个文件")) else: self.root.after(0, lambda: self.status_var.set(f"搜索失败: {result.stderr}")) except Exception as e: self.root.after(0, lambda: self.status_var.set(f"错误: {str(e)}")) def display_results(self, file_paths): """在树形视图中显示结果""" self.result_tree.delete(*self.result_tree.get_children()) for path in file_paths: if os.path.exists(path): file_name = os.path.basename(path) file_size = self.format_size(os.path.getsize(path)) modified_time = self.format_time(os.path.getmtime(path)) self.result_tree.insert('', 'end', values=( file_name, os.path.dirname(path), file_size, modified_time )) self.result_count.config(text=f"找到 {len(file_paths)} 个文件") def open_selected_file(self, event): """打开选中的文件""" selected_item = self.result_tree.selection() if selected_item: item_data = self.result_tree.item(selected_item[0], 'values') file_path = os.path.join(item_data[1], item_data[0]) try: os.startfile(file_path) except Exception as e: messagebox.showerror("错误", f"无法打开文件:\n{str(e)}") def sort_column(self, column, reverse): """对列进行排序""" data = [(self.result_tree.set(child, column), child) for child in self.result_tree.get_children('')] # 特殊处理大小和日期列 if column == 'size': data.sort(key=lambda x: self.parse_size(x[0]), reverse=reverse) elif column == 'modified': data.sort(key=lambda x: x[0], reverse=reverse) else: data.sort(reverse=reverse) for index, (_, child) in enumerate(data): self.result_tree.move(child, '', index) # 反转下一次排序顺序 self.result_tree.heading(column, command=lambda: self.sort_column(column, not reverse)) def format_size(self, size_bytes): """格式化文件大小显示""" for unit in ['B', 'KB', 'MB', 'GB']: if size_bytes < 1024.0: return f"{size_bytes:.1f} {unit}" size_bytes /= 1024.0 return f"{size_bytes:.1f} GB" def parse_size(self, size_str): """解析大小字符串为字节数""" units = {"B": 1, "KB": 1024, "MB": 1024**2, "GB": 1024**3} num, unit = size_str.split() return float(num) * units.get(unit.upper(), 1) def format_time(self, timestamp): """格式化时间戳""" from datetime import datetime return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') if __name__ == "__main__": root = tk.Tk() app = EverythingSearcher(root) root.mainloop() ``` ## 功能说明 这个图形化工具具有以下特点: 1. **直观的搜索界面**: - 文本框接收搜索表达式(支持通配符和运算符) - 回车键或搜索按钮触发搜索 - 实时显示搜索结果数量 2. **详细的文件展示**: - 文件名、路径、大小和修改时间分列显示 - 可点击列标题进行排序(文件名、路径、大小、日期) - 双击结果项使用系统默认程序打开文件 3. **搜索语法支持**: - 支持Everything所有高级搜索语法 - 示例:`*.pdf size:>1mb modified:lastweek` 4. **异步搜索处理**: - 使用多线程避免界面冻结 - 状态栏实时显示搜索进度 - 自动处理路径中的特殊字符 ## 安装与使用指南 ### 准备工作 1. 安装 [Everything](https://www.voidtools.com/) 最新版 2. 确保Everything安装目录添加到系统PATH 3. 安装Python 3.6+ 和 tkinter库 ### 运行步骤 ```bash python everything_gui.py ``` ### 使用技巧 1. 使用`folder:`限定搜索目录:`folder:C:\\Projects *.py` 2. 组合多个条件:`report*.docx !draft size:>500kb` 3. 按修改时间过滤:`modified:today` 或 `modified:2023-01-01..2023-12-31` ## 技术原理 此工具的核心是通过Everything命令行接口(`es.exe`)实现高速文件搜索: 1. Python使用`subprocess`模块调用命令行工具 2. 搜索表达式通过命令行参数传递 3. 结果解析为文件路径列表 4. 使用`os.path`模块提取文件元数据 5. Tkinter实现响应式图形界面 相比传统文件遍历方法,Everything利用NTFS文件系统特性实现毫秒级搜索速度[^1],特别适合大容量存储设备。 ## 高级扩展建议 1. **添加文件预览功能**: ```python def show_preview(file_path): # 根据文件类型显示缩略图或文本预览 ``` 2. **集成文件操作**: ```python # 添加右键菜单选项(复制、移动、删除等) self.result_tree.bind('<Button-3>', self.show_context_menu) ``` 3. **保存搜索历史**: ```python # 使用sqlite3保存常用搜索 import sqlite3 ``` 4. **多线程优化**: ```python # 使用queue管理搜索任务 import queue ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值