everytools


Nameeverytools JSON
Version 0.2.2 PyPI version JSON
download
home_pagehttps://github.com/yangjiada/everytools
SummaryPython tools for Everything search engine
upload_time2025-07-20 00:13:31
maintainerNone
docs_urlNone
authorJan Yang
requires_python>=3.6
licenseNone
keywords everything everytools windows file search file search everything sdk
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # everytools

一个强大的Python库,用于调用Windows系统上的Everything搜索引擎进行高效文件搜索。

## 特性

- 🚀 **高性能搜索** - 基于Everything搜索引擎,毫秒级搜索速度
- 🎯 **现代化API** - 提供链式调用的SearchBuilder和丰富的过滤器
- 🔄 **向后兼容** - 保留传统API,无缝升级
- 🎨 **丰富过滤器** - 支持文件类型、大小、日期、媒体类型等多种过滤
- 📊 **详细结果** - 获取文件名、路径、大小、创建/修改时间等完整信息
- ⚡ **异步支持** - 支持异步搜索,避免阻塞
- 🛡️ **错误处理** - 完善的异常处理机制
- 📝 **完整文档** - 详细的使用说明和示例代码

## 库的整体结构
```
everytools/
├── __init__.py           # 包入口点,导出主要类和函数
├── everytools.py         # 传统API实现(向后兼容)
├── constants.py          # 常量定义(排序类型、请求标志、错误码等)
├── exceptions.py         # 自定义异常类
├── config.py             # 配置管理
├── utils/                # 工具函数模块
│   ├── __init__.py
│   ├── download.py       # Everything SDK DLL下载工具
│   └── time_utils.py     # Windows FILETIME时间转换工具
├── core/                 # 核心功能模块
│   ├── __init__.py
│   ├── dll_loader.py     # DLL加载和初始化管理
│   └── result.py         # 搜索结果处理和封装
├── query/                # 查询功能模块
│   ├── __init__.py
│   ├── search.py         # 现代化搜索API(SearchBuilder)
│   └── filters.py        # 搜索过滤器(文件、日期、媒体等)
└── dll/                  # Everything SDK DLL文件存放目录
    ├── Everything32.dll  # 32位DLL(自动下载)
    └── Everything64.dll  # 64位DLL(自动下载)
```

## 运行环境

### 安装everything软件

由于需要调用电脑版everything程序,没有安装的需要[下载](https://www.voidtools.com/zh-cn/downloads/)安装everything,安装完后请确保已经运行,任务栏会出现程序图标。

### 安装everytools库

在命令行窗口下使用pip进行安装everytools库

```shell
pip install everytools
```

## 使用方法

### 新API (推荐)

从v0.2.0开始,everytools提供了更加现代化、易用的API。根据不同的使用场景,我们提供了两种搜索方式:

#### 1. 简单搜索 - Search类 (高性能)

适用于简单查询和性能敏感的场景:

```python
from everytools import Search

# 直接创建搜索实例
search = Search("Python")
search.execute()
results = search.get_results()

# 遍历结果
for result in results:
    print(f"{result.name} - {result.full_path} ({result.size} bytes)")
```

带参数的简单搜索:

```python
from everytools import Search, SortType, RequestFlag

# 创建带参数的搜索
search = Search(
    query_string="*.py",
    match_case=False,
    sort_type=SortType.SIZE_DESCENDING,
    max_results=10,
    request_flags=RequestFlag.FILE_NAME | RequestFlag.PATH | RequestFlag.SIZE
)
search.execute()
results = search.get_results()
```

#### 2. 构建器搜索 - SearchBuilder类 (易用性)

适用于复杂查询构建和需要链式调用的场景:

```python
from everytools import SearchBuilder, FileFilter, SortType

# 创建搜索构建器
search = (
    SearchBuilder()
    .keywords("Python")  # 搜索关键词
    .filter(FileFilter().with_extensions("py", "txt"))  # 过滤器
    .match_case(False)   # 不区分大小写
    .sort_by(SortType.SIZE_DESCENDING)  # 按大小降序排序
    .limit(10)           # 限制结果数量
    .execute()           # 执行搜索
)

# 获取结果
results = search.get_results()

# 遍历结果
for result in results:
    print(f"{result.name} - {result.full_path} ({result.size} bytes)")
```

#### 性能对比与使用建议

**Search类 vs SearchBuilder类的性能差异:**

| 特性 | Search类 | SearchBuilder类 |
|------|----------|----------------|
| 执行速度 | ⚡ 更快 | 🐌 较慢 |
| 内存占用 | 💾 更少 | 📦 较多 |
| 代码简洁性 | 📝 简单直接 | 🎨 链式调用 |
| 功能丰富性 | 🔧 基础功能 | 🛠️ 丰富过滤器 |

**性能差异原因:**
- SearchBuilder需要额外的对象创建和参数传递开销
- SearchBuilder在execute()时会创建新的Search实例
- 查询字符串需要动态构建和组装

**使用场景建议:**

```python
# ✅ 推荐使用Search类的场景:
# 1. 高频查询(如实时搜索)
# 2. 简单关键词搜索
# 3. 性能敏感的应用
# 4. 批量处理大量搜索请求

from everytools import Search

# 高频搜索示例
def quick_search(keyword):
    search = Search(keyword)
    search.execute()
    return search.get_results()

# ✅ 推荐使用SearchBuilder类的场景:
# 1. 复杂查询条件组合
# 2. 需要多种过滤器
# 3. 代码可读性要求高
# 4. 一次性查询任务

from everytools import SearchBuilder, FileFilter, DateFilter

# 复杂查询示例
def complex_search():
    return (
        SearchBuilder()
        .keywords("project")
        .filter(FileFilter().with_extensions("py", "js"))
        .filter(DateFilter().modified_after("2024-01-01"))
        .sort_by(SortType.DATE_MODIFIED_DESCENDING)
        .limit(50)
        .execute()
        .get_results()
    )
```

**性能优化技巧:**

```python
# 1. 复用Search实例
search = Search("")
for keyword in ["python", "java", "javascript"]:
    search._query_string = keyword
    search.execute()
    results = search.get_results()
    # 处理结果...

# 2. 预设常用搜索配置
def create_optimized_search(query):
    return Search(
        query_string=query,
        max_results=100,  # 限制结果数量
        request_flags=RequestFlag.FILE_NAME | RequestFlag.PATH  # 只请求必要信息
    )

# 3. 批量处理
def batch_search(keywords, batch_size=10):
    results = {}
    for i in range(0, len(keywords), batch_size):
        batch = keywords[i:i+batch_size]
        for keyword in batch:
            search = Search(keyword)
            search.execute()
            results[keyword] = search.get_results()
    return results
```

#### 使用过滤器

everytools提供了丰富的过滤器来精确控制搜索结果:

```python
from everytools import SearchBuilder, FileFilter, FolderFilter, MediaFilter, DocumentFilter, DateFilter, SizeFilter

# 文件过滤器 - 搜索大于1MB的Python文件
python_files = FileFilter().with_extensions("py").with_size_range(min_size=1024*1024)

# 文件夹过滤器 - 搜索空文件夹
empty_folders = FolderFilter().empty_only()

# 媒体过滤器 - 搜索图片文件
images = MediaFilter("image")  # 支持 "audio", "video", "image", "all"

# 文档过滤器 - 搜索Office文档
documents = DocumentFilter("office")  # 支持 "office", "pdf", "text", "all"

# 日期过滤器 - 搜索最近修改的文件
recent_files = DateFilter().modified_after("2024-01-01")

# 大小过滤器 - 搜索大文件
large_files = SizeFilter().larger_than_mb(100)  # 大于100MB

# 组合多个过滤器
search = (
    SearchBuilder()
    .keywords("project")
    .filter(python_files)
    .filter(recent_files)
    .sort_by(SortType.DATE_MODIFIED_DESCENDING)
    .execute()
)
```

##### 过滤器详细说明

**FileFilter(文件过滤器)**
```python
file_filter = (
    FileFilter()
    .with_extensions("py", "txt", "md")  # 指定文件扩展名
    .with_size_range(min_size=1024, max_size=1024*1024)  # 文件大小范围
    .with_content("TODO")  # 搜索文件内容(仅文本文件)
    .duplicates_only()  # 仅显示重复文件
)
```

**DateFilter(日期过滤器)**
```python
date_filter = (
    DateFilter()
    .by_modified_date()  # 按修改日期过滤
    .in_range("2024-01-01", "2024-12-31")  # 日期范围
)

# 便捷方法
recent_created = DateFilter().created_after("2024-06-01")
recent_modified = DateFilter().modified_after("2024-06-01")
```

**SizeFilter(大小过滤器)**
```python
size_filter = (
    SizeFilter()
    .larger_than_mb(10)  # 大于10MB
    .smaller_than_gb(1)  # 小于1GB
)
```

#### 异步搜索

```python
from everytools import SearchBuilder

# 创建一个异步搜索
search = SearchBuilder().keywords("large files").execute(async_query=True)

# 等待搜索完成
if search.wait_for_completion(timeout_ms=5000):
    results = search.get_results()
    print(f"找到 {len(results)} 个结果")
else:
    print("搜索超时!")
```

### 传统API (向后兼容)

为了兼容旧版本,我们继续保留了传统API:

```python
# 导入EveryTools类
from everytools import EveryTools

es = EveryTools()  # 实例化,只需要第一次就行
```

#### 用名称搜索

使用`search()`方法可以通过输入关键词检索文件,一般在几秒内能结束,检索完后可以读取结果数量。

```python
es.search('工作')
print('everything reuslt number:', es.get_num_total_results())  # 获取搜索结果对象数量
```

#### 获取搜索数量

搜索后可以获得的数量有三种:结果总数量、文件数量、文件夹数量。

```python
es.get_num_total_results()  #总数量
es.get_num_total_file()  # 文件数量
es.get_num_total_folder()  # 文件夹数量
```

#### 获取搜索结果

使用`results()`获取搜索结果,该返回为迭代器。输出结果会包含name, path等信息,由于检索信息需要耗一定时间,数量比较多的情况下需要等待片刻。

```python
results = es.results()  # 获取输出结果

# 只打印前五个结果
for i, result in enumerate(results):
    if i >= 5:
        break
    print(result)
```

#### 更改结果排序

更改`results`方法`sort_type`参数实现更改排序结果,默认参数为`1`,其他参数如下:

| **排序类型** | **值** |
| :----------: | :----: |
|   名称升序   |   1    |
|   名称降序   |   2    |
|   路径升序   |   3    |
|   路径降序   |   4    |
|   大小升序   |   5    |
|   大小降序   |   6    |
|  拓展名升序  |   7    |
|  拓展名降序  |   8    |

#### 快速搜索方法

```python
es.search_audio()  # 搜索音频
es.search_zip()  # 搜索压缩包
es.search_doc()  # 搜索文档
es.search_exe()  # 搜索可执行文件
es.search_folder()  # 搜索文件夹
es.search_pic()  # 搜索图片
es.search_video()  # 搜索视频
es.search_ext(ext='pdf')  # 搜索文件拓展
es.search_in_located('C:\\Users\\')  # 搜索指定文件夹下
```

## 高级功能

### 搜索结果详细信息

每个搜索结果包含丰富的文件信息:

```python
from everytools import SearchBuilder

search = SearchBuilder().keywords("example").limit(1).execute()
results = search.get_results()

for result in results:
    print(f"文件名: {result.name}")
    print(f"路径: {result.path}")
    print(f"完整路径: {result.full_path}")
    print(f"文件大小: {result.size} 字节")
    print(f"创建时间: {result.date_created}")
    print(f"修改时间: {result.date_modified}")
    print(f"访问时间: {result.date_accessed}")
    print(f"文件扩展名: {result.extension}")
    print(f"是否为文件: {result.is_file}")
    print(f"是否为文件夹: {result.is_folder}")
    print(f"文件属性: {result.attributes}")
```

### 排序选项

everytools支持多种排序方式:

```python
from everytools import SearchBuilder, SortType

# 按名称排序
search = SearchBuilder().keywords("test").sort_by(SortType.NAME_ASCENDING).execute()

# 按大小排序
search = SearchBuilder().keywords("test").sort_by(SortType.SIZE_DESCENDING).execute()

# 按修改时间排序
search = SearchBuilder().keywords("test").sort_by(SortType.DATE_MODIFIED_DESCENDING).execute()
```

**可用的排序类型:**
- `NAME_ASCENDING` / `NAME_DESCENDING` - 按名称排序
- `PATH_ASCENDING` / `PATH_DESCENDING` - 按路径排序  
- `SIZE_ASCENDING` / `SIZE_DESCENDING` - 按大小排序
- `EXTENSION_ASCENDING` / `EXTENSION_DESCENDING` - 按扩展名排序
- `DATE_CREATED_ASCENDING` / `DATE_CREATED_DESCENDING` - 按创建时间排序
- `DATE_MODIFIED_ASCENDING` / `DATE_MODIFIED_DESCENDING` - 按修改时间排序
- `DATE_ACCESSED_ASCENDING` / `DATE_ACCESSED_DESCENDING` - 按访问时间排序

### 错误处理

everytools提供了完善的错误处理机制:

```python
from everytools import SearchBuilder, EverythingError

try:
    search = SearchBuilder().keywords("test").execute()
    results = search.get_results()
    print(f"找到 {len(results)} 个结果")
except EverythingError as e:
    print(f"搜索出错: {e}")
except Exception as e:
    print(f"其他错误: {e}")
```

### 系统信息查询

```python
from everytools.core.dll_loader import get_dll_loader

loader = get_dll_loader()
print(f"Everything版本: {loader.version}")
print(f"数据库已加载: {loader.is_db_loaded()}")
print(f"管理员权限: {loader.is_admin()}")
```

## Everything搜索语法

everytools完全支持Everything的强大搜索语法,可以直接在关键词中使用:

### 基本语法

```python
# 通配符
SearchBuilder().keywords("*.txt").execute()  # 所有txt文件
SearchBuilder().keywords("test?.doc").execute()  # test后跟一个字符的doc文件

# 逻辑操作符
SearchBuilder().keywords("python AND tutorial").execute()  # 包含python和tutorial
SearchBuilder().keywords("python OR java").execute()  # 包含python或java
SearchBuilder().keywords("python NOT tutorial").execute()  # 包含python但不包含tutorial

# 路径搜索
SearchBuilder().keywords("c:\\users\\").execute()  # 在特定路径下搜索
SearchBuilder().keywords("parent:c:\\users\\").execute()  # 父目录为指定路径
```

### 高级语法

```python
# 文件大小
SearchBuilder().keywords("size:>1mb").execute()  # 大于1MB的文件
SearchBuilder().keywords("size:1kb..1mb").execute()  # 1KB到1MB之间的文件

# 日期搜索
SearchBuilder().keywords("dm:today").execute()  # 今天修改的文件
SearchBuilder().keywords("dc:2024").execute()  # 2024年创建的文件
SearchBuilder().keywords("dm:>2024/1/1").execute()  # 2024年1月1日后修改的文件

# 文件属性
SearchBuilder().keywords("attrib:h").execute()  # 隐藏文件
SearchBuilder().keywords("attrib:r").execute()  # 只读文件

# 正则表达式
SearchBuilder().keywords("regex:test\\d+\\.txt").use_regex(True).execute()
```

### 常用搜索模式

```python
# 查找重复文件
SearchBuilder().keywords("dupe:").execute()

# 查找空文件夹
SearchBuilder().keywords("empty:").execute()

# 查找大文件(前100个最大的文件)
SearchBuilder().keywords("").sort_by(SortType.SIZE_DESCENDING).limit(100).execute()

# 查找最近修改的文件
SearchBuilder().keywords("dm:today").sort_by(SortType.DATE_MODIFIED_DESCENDING).execute()
```

## 实用示例

### 常见使用场景

#### 1. 清理重复文件

```python
from everytools import SearchBuilder, FileFilter

# 查找重复文件
duplicates = SearchBuilder().keywords("dupe:").execute().get_results()

print(f"找到 {len(duplicates)} 个重复文件:")
for file in duplicates:
    print(f"- {file.full_path} ({file.size} bytes)")
```

#### 2. 查找大文件释放空间

```python
from everytools import SearchBuilder, SortType

# 查找最大的100个文件
large_files = (
    SearchBuilder()
    .keywords("")  # 搜索所有文件
    .sort_by(SortType.SIZE_DESCENDING)
    .limit(100)
    .execute()
    .get_results()
)

print("最大的文件:")
for file in large_files[:10]:  # 显示前10个
    size_mb = file.size / (1024 * 1024) if file.size else 0
    print(f"- {file.name}: {size_mb:.2f} MB")
```

#### 3. 项目文件管理

```python
from everytools import SearchBuilder, FileFilter, DateFilter

# 查找项目中的Python文件,按最近修改时间排序
project_files = (
    SearchBuilder()
    .keywords("C:\\MyProject\\")  # 指定项目路径
    .filter(FileFilter().with_extensions("py", "js", "html", "css"))
    .filter(DateFilter().modified_after("2024-01-01"))
    .sort_by(SortType.DATE_MODIFIED_DESCENDING)
    .execute()
    .get_results()
)

print("最近修改的项目文件:")
for file in project_files[:20]:
    print(f"- {file.name} (修改于: {file.date_modified})")
```

#### 4. 媒体文件整理

```python
from everytools import SearchBuilder, MediaFilter, SizeFilter

# 查找大于50MB的视频文件
large_videos = (
    SearchBuilder()
    .filter(MediaFilter("video"))
    .filter(SizeFilter().larger_than_mb(50))
    .sort_by(SortType.SIZE_DESCENDING)
    .execute()
    .get_results()
)

print("大视频文件:")
for video in large_videos:
    size_gb = video.size / (1024 * 1024 * 1024) if video.size else 0
    print(f"- {video.name}: {size_gb:.2f} GB")
```

#### 5. 系统清理

```python
from everytools import SearchBuilder, FileFilter

# 查找临时文件
temp_files = (
    SearchBuilder()
    .filter(FileFilter().with_extensions("tmp", "temp", "cache", "log"))
    .filter(DateFilter().modified_after("2024-01-01"))
    .execute()
    .get_results()
)

print(f"找到 {len(temp_files)} 个临时文件")

# 查找空文件夹
empty_folders = SearchBuilder().keywords("empty:").execute().get_results()
print(f"找到 {len(empty_folders)} 个空文件夹")
```

### 性能优化建议

#### 1. 使用适当的过滤器

```python
# 好的做法:使用具体的过滤器
search = (
    SearchBuilder()
    .keywords("report")
    .filter(FileFilter().with_extensions("pdf", "docx"))
    .filter(DateFilter().modified_after("2024-01-01"))
    .limit(100)  # 限制结果数量
    .execute()
)

# 避免:过于宽泛的搜索
# search = SearchBuilder().keywords("").execute()  # 会返回所有文件
```

#### 2. 合理使用限制

```python
# 对于大量结果,使用limit限制
search = SearchBuilder().keywords("*.txt").limit(1000).execute()

# 或者分批处理
def process_search_results(keywords, batch_size=100):
    search = SearchBuilder().keywords(keywords).execute()
    results = search.get_results()
    
    for i in range(0, len(results), batch_size):
        batch = list(results)[i:i+batch_size]
        # 处理这一批结果
        yield batch
```

#### 3. 异步搜索处理

```python
import time
from everytools import SearchBuilder

def search_with_timeout(keywords, timeout_seconds=10):
    search = SearchBuilder().keywords(keywords).execute(async_query=True)
    
    if search.wait_for_completion(timeout_ms=timeout_seconds * 1000):
        return search.get_results()
    else:
        print("搜索超时")
        return []

# 使用示例
results = search_with_timeout("large files", timeout_seconds=5)
```

## 故障排除

### 常见问题

#### 1. Everything未运行

```python
from everytools.core.dll_loader import get_dll_loader

try:
    loader = get_dll_loader()
    if not loader.is_db_loaded():
        print("Everything数据库未加载,请确保Everything正在运行")
except Exception as e:
    print(f"无法连接到Everything: {e}")
    print("请确保:")
    print("1. Everything已安装并正在运行")
    print("2. Everything服务已启动")
    print("3. 当前用户有足够权限")
```

#### 2. DLL加载失败

```python
import os
from everytools.utils.download import download_sdk_dll

# 手动下载DLL
dll_dir = os.path.join(os.path.dirname(__file__), "everytools", "dll")
try:
    download_sdk_dll(dll_dir)
    print("DLL下载成功")
except Exception as e:
    print(f"DLL下载失败: {e}")
```

#### 3. 搜索结果为空

```python
from everytools import SearchBuilder

search = SearchBuilder().keywords("test").execute()
results = search.get_results()

if len(results) == 0:
    print("搜索结果为空,可能的原因:")
    print("1. 搜索关键词不存在")
    print("2. Everything索引未完成")
    print("3. 搜索路径不在索引范围内")
    
    # 尝试更宽泛的搜索
    broad_search = SearchBuilder().keywords("*").limit(10).execute()
    broad_results = broad_search.get_results()
    print(f"宽泛搜索找到 {len(broad_results)} 个结果")
```

## 其他方法

### 查看版本信息

```python
# 新API方式
from everytools.core.dll_loader import get_dll_loader
loader = get_dll_loader()
print(f"Everything版本: {loader.version}")

# 传统API方式
from everytools import EveryTools
es = EveryTools()
print(f"主要版本: {es.major_version}")
print(f"次要版本: {es.minor_version}")
print(f"修正版: {es.revision}")
print(f"编译号: {es.build_number}")
print(f"完整版本: {es.version}")
```

![image](images/1.png)

## 版本更新

| **版本** |                          **更新内容**                          |  **日期**  |
| :------: | :------------------------------------------------------------: | :--------: |
| 0.2.1 | 修复filters各种bug | 2025-07-19 |
| 0.2.0    | 重构项目架构,提供新的现代API,支持异步搜索和更多过滤功能     | 2025-07-19 |
| 0.0.1.4    | 去掉多余的pandas模块     | 2025-07-06 |
| 0.0.1.2  | 修复搜索拓展不生效,输出结果新增拓展名,优化搜索为空返回值     | 2021-10-06 |
| 0.0.1.1  | 修复安装时环境依赖警告                                         | 2021-09-25 |
| 0.0.1.0  | 提供everything基本搜索以及快速搜索方法。                       | 2021-09-25 |

## 联系作者

**作者(author):Jan Yang**

**邮箱(Email):yang.jiada@foxmail.com**


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/yangjiada/everytools",
    "name": "everytools",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "everything, everytools, windows, file, search, file search, everything sdk",
    "author": "Jan Yang",
    "author_email": "yang.jiada@foxmail.com",
    "download_url": "https://files.pythonhosted.org/packages/6c/13/b005c4aaeb00c531af73adf0ab19b380a537462af260246366f7dbabffab/everytools-0.2.2.tar.gz",
    "platform": null,
    "description": "# everytools\r\n\r\n\u4e00\u4e2a\u5f3a\u5927\u7684Python\u5e93\uff0c\u7528\u4e8e\u8c03\u7528Windows\u7cfb\u7edf\u4e0a\u7684Everything\u641c\u7d22\u5f15\u64ce\u8fdb\u884c\u9ad8\u6548\u6587\u4ef6\u641c\u7d22\u3002\r\n\r\n## \u7279\u6027\r\n\r\n- \ud83d\ude80 **\u9ad8\u6027\u80fd\u641c\u7d22** - \u57fa\u4e8eEverything\u641c\u7d22\u5f15\u64ce\uff0c\u6beb\u79d2\u7ea7\u641c\u7d22\u901f\u5ea6\r\n- \ud83c\udfaf **\u73b0\u4ee3\u5316API** - \u63d0\u4f9b\u94fe\u5f0f\u8c03\u7528\u7684SearchBuilder\u548c\u4e30\u5bcc\u7684\u8fc7\u6ee4\u5668\r\n- \ud83d\udd04 **\u5411\u540e\u517c\u5bb9** - \u4fdd\u7559\u4f20\u7edfAPI\uff0c\u65e0\u7f1d\u5347\u7ea7\r\n- \ud83c\udfa8 **\u4e30\u5bcc\u8fc7\u6ee4\u5668** - \u652f\u6301\u6587\u4ef6\u7c7b\u578b\u3001\u5927\u5c0f\u3001\u65e5\u671f\u3001\u5a92\u4f53\u7c7b\u578b\u7b49\u591a\u79cd\u8fc7\u6ee4\r\n- \ud83d\udcca **\u8be6\u7ec6\u7ed3\u679c** - \u83b7\u53d6\u6587\u4ef6\u540d\u3001\u8def\u5f84\u3001\u5927\u5c0f\u3001\u521b\u5efa/\u4fee\u6539\u65f6\u95f4\u7b49\u5b8c\u6574\u4fe1\u606f\r\n- \u26a1 **\u5f02\u6b65\u652f\u6301** - \u652f\u6301\u5f02\u6b65\u641c\u7d22\uff0c\u907f\u514d\u963b\u585e\r\n- \ud83d\udee1\ufe0f **\u9519\u8bef\u5904\u7406** - \u5b8c\u5584\u7684\u5f02\u5e38\u5904\u7406\u673a\u5236\r\n- \ud83d\udcdd **\u5b8c\u6574\u6587\u6863** - \u8be6\u7ec6\u7684\u4f7f\u7528\u8bf4\u660e\u548c\u793a\u4f8b\u4ee3\u7801\r\n\r\n## \u5e93\u7684\u6574\u4f53\u7ed3\u6784\r\n```\r\neverytools/\r\n\u251c\u2500\u2500 __init__.py           # \u5305\u5165\u53e3\u70b9\uff0c\u5bfc\u51fa\u4e3b\u8981\u7c7b\u548c\u51fd\u6570\r\n\u251c\u2500\u2500 everytools.py         # \u4f20\u7edfAPI\u5b9e\u73b0\uff08\u5411\u540e\u517c\u5bb9\uff09\r\n\u251c\u2500\u2500 constants.py          # \u5e38\u91cf\u5b9a\u4e49\uff08\u6392\u5e8f\u7c7b\u578b\u3001\u8bf7\u6c42\u6807\u5fd7\u3001\u9519\u8bef\u7801\u7b49\uff09\r\n\u251c\u2500\u2500 exceptions.py         # \u81ea\u5b9a\u4e49\u5f02\u5e38\u7c7b\r\n\u251c\u2500\u2500 config.py             # \u914d\u7f6e\u7ba1\u7406\r\n\u251c\u2500\u2500 utils/                # \u5de5\u5177\u51fd\u6570\u6a21\u5757\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u251c\u2500\u2500 download.py       # Everything SDK DLL\u4e0b\u8f7d\u5de5\u5177\r\n\u2502   \u2514\u2500\u2500 time_utils.py     # Windows FILETIME\u65f6\u95f4\u8f6c\u6362\u5de5\u5177\r\n\u251c\u2500\u2500 core/                 # \u6838\u5fc3\u529f\u80fd\u6a21\u5757\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u251c\u2500\u2500 dll_loader.py     # DLL\u52a0\u8f7d\u548c\u521d\u59cb\u5316\u7ba1\u7406\r\n\u2502   \u2514\u2500\u2500 result.py         # \u641c\u7d22\u7ed3\u679c\u5904\u7406\u548c\u5c01\u88c5\r\n\u251c\u2500\u2500 query/                # \u67e5\u8be2\u529f\u80fd\u6a21\u5757\r\n\u2502   \u251c\u2500\u2500 __init__.py\r\n\u2502   \u251c\u2500\u2500 search.py         # \u73b0\u4ee3\u5316\u641c\u7d22API\uff08SearchBuilder\uff09\r\n\u2502   \u2514\u2500\u2500 filters.py        # \u641c\u7d22\u8fc7\u6ee4\u5668\uff08\u6587\u4ef6\u3001\u65e5\u671f\u3001\u5a92\u4f53\u7b49\uff09\r\n\u2514\u2500\u2500 dll/                  # Everything SDK DLL\u6587\u4ef6\u5b58\u653e\u76ee\u5f55\r\n    \u251c\u2500\u2500 Everything32.dll  # 32\u4f4dDLL\uff08\u81ea\u52a8\u4e0b\u8f7d\uff09\r\n    \u2514\u2500\u2500 Everything64.dll  # 64\u4f4dDLL\uff08\u81ea\u52a8\u4e0b\u8f7d\uff09\r\n```\r\n\r\n## \u8fd0\u884c\u73af\u5883\r\n\r\n### \u5b89\u88c5everything\u8f6f\u4ef6\r\n\r\n\u7531\u4e8e\u9700\u8981\u8c03\u7528\u7535\u8111\u7248everything\u7a0b\u5e8f\uff0c\u6ca1\u6709\u5b89\u88c5\u7684\u9700\u8981[\u4e0b\u8f7d](https://www.voidtools.com/zh-cn/downloads/)\u5b89\u88c5everything\uff0c\u5b89\u88c5\u5b8c\u540e\u8bf7\u786e\u4fdd\u5df2\u7ecf\u8fd0\u884c\uff0c\u4efb\u52a1\u680f\u4f1a\u51fa\u73b0\u7a0b\u5e8f\u56fe\u6807\u3002\r\n\r\n### \u5b89\u88c5everytools\u5e93\r\n\r\n\u5728\u547d\u4ee4\u884c\u7a97\u53e3\u4e0b\u4f7f\u7528pip\u8fdb\u884c\u5b89\u88c5everytools\u5e93\r\n\r\n```shell\r\npip install everytools\r\n```\r\n\r\n## \u4f7f\u7528\u65b9\u6cd5\r\n\r\n### \u65b0API (\u63a8\u8350)\r\n\r\n\u4ecev0.2.0\u5f00\u59cb\uff0ceverytools\u63d0\u4f9b\u4e86\u66f4\u52a0\u73b0\u4ee3\u5316\u3001\u6613\u7528\u7684API\u3002\u6839\u636e\u4e0d\u540c\u7684\u4f7f\u7528\u573a\u666f\uff0c\u6211\u4eec\u63d0\u4f9b\u4e86\u4e24\u79cd\u641c\u7d22\u65b9\u5f0f\uff1a\r\n\r\n#### 1. \u7b80\u5355\u641c\u7d22 - Search\u7c7b (\u9ad8\u6027\u80fd)\r\n\r\n\u9002\u7528\u4e8e\u7b80\u5355\u67e5\u8be2\u548c\u6027\u80fd\u654f\u611f\u7684\u573a\u666f\uff1a\r\n\r\n```python\r\nfrom everytools import Search\r\n\r\n# \u76f4\u63a5\u521b\u5efa\u641c\u7d22\u5b9e\u4f8b\r\nsearch = Search(\"Python\")\r\nsearch.execute()\r\nresults = search.get_results()\r\n\r\n# \u904d\u5386\u7ed3\u679c\r\nfor result in results:\r\n    print(f\"{result.name} - {result.full_path} ({result.size} bytes)\")\r\n```\r\n\r\n\u5e26\u53c2\u6570\u7684\u7b80\u5355\u641c\u7d22\uff1a\r\n\r\n```python\r\nfrom everytools import Search, SortType, RequestFlag\r\n\r\n# \u521b\u5efa\u5e26\u53c2\u6570\u7684\u641c\u7d22\r\nsearch = Search(\r\n    query_string=\"*.py\",\r\n    match_case=False,\r\n    sort_type=SortType.SIZE_DESCENDING,\r\n    max_results=10,\r\n    request_flags=RequestFlag.FILE_NAME | RequestFlag.PATH | RequestFlag.SIZE\r\n)\r\nsearch.execute()\r\nresults = search.get_results()\r\n```\r\n\r\n#### 2. \u6784\u5efa\u5668\u641c\u7d22 - SearchBuilder\u7c7b (\u6613\u7528\u6027)\r\n\r\n\u9002\u7528\u4e8e\u590d\u6742\u67e5\u8be2\u6784\u5efa\u548c\u9700\u8981\u94fe\u5f0f\u8c03\u7528\u7684\u573a\u666f\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter, SortType\r\n\r\n# \u521b\u5efa\u641c\u7d22\u6784\u5efa\u5668\r\nsearch = (\r\n    SearchBuilder()\r\n    .keywords(\"Python\")  # \u641c\u7d22\u5173\u952e\u8bcd\r\n    .filter(FileFilter().with_extensions(\"py\", \"txt\"))  # \u8fc7\u6ee4\u5668\r\n    .match_case(False)   # \u4e0d\u533a\u5206\u5927\u5c0f\u5199\r\n    .sort_by(SortType.SIZE_DESCENDING)  # \u6309\u5927\u5c0f\u964d\u5e8f\u6392\u5e8f\r\n    .limit(10)           # \u9650\u5236\u7ed3\u679c\u6570\u91cf\r\n    .execute()           # \u6267\u884c\u641c\u7d22\r\n)\r\n\r\n# \u83b7\u53d6\u7ed3\u679c\r\nresults = search.get_results()\r\n\r\n# \u904d\u5386\u7ed3\u679c\r\nfor result in results:\r\n    print(f\"{result.name} - {result.full_path} ({result.size} bytes)\")\r\n```\r\n\r\n#### \u6027\u80fd\u5bf9\u6bd4\u4e0e\u4f7f\u7528\u5efa\u8bae\r\n\r\n**Search\u7c7b vs SearchBuilder\u7c7b\u7684\u6027\u80fd\u5dee\u5f02\uff1a**\r\n\r\n| \u7279\u6027 | Search\u7c7b | SearchBuilder\u7c7b |\r\n|------|----------|----------------|\r\n| \u6267\u884c\u901f\u5ea6 | \u26a1 \u66f4\u5feb | \ud83d\udc0c \u8f83\u6162 |\r\n| \u5185\u5b58\u5360\u7528 | \ud83d\udcbe \u66f4\u5c11 | \ud83d\udce6 \u8f83\u591a |\r\n| \u4ee3\u7801\u7b80\u6d01\u6027 | \ud83d\udcdd \u7b80\u5355\u76f4\u63a5 | \ud83c\udfa8 \u94fe\u5f0f\u8c03\u7528 |\r\n| \u529f\u80fd\u4e30\u5bcc\u6027 | \ud83d\udd27 \u57fa\u7840\u529f\u80fd | \ud83d\udee0\ufe0f \u4e30\u5bcc\u8fc7\u6ee4\u5668 |\r\n\r\n**\u6027\u80fd\u5dee\u5f02\u539f\u56e0\uff1a**\r\n- SearchBuilder\u9700\u8981\u989d\u5916\u7684\u5bf9\u8c61\u521b\u5efa\u548c\u53c2\u6570\u4f20\u9012\u5f00\u9500\r\n- SearchBuilder\u5728execute()\u65f6\u4f1a\u521b\u5efa\u65b0\u7684Search\u5b9e\u4f8b\r\n- \u67e5\u8be2\u5b57\u7b26\u4e32\u9700\u8981\u52a8\u6001\u6784\u5efa\u548c\u7ec4\u88c5\r\n\r\n**\u4f7f\u7528\u573a\u666f\u5efa\u8bae\uff1a**\r\n\r\n```python\r\n# \u2705 \u63a8\u8350\u4f7f\u7528Search\u7c7b\u7684\u573a\u666f\uff1a\r\n# 1. \u9ad8\u9891\u67e5\u8be2\uff08\u5982\u5b9e\u65f6\u641c\u7d22\uff09\r\n# 2. \u7b80\u5355\u5173\u952e\u8bcd\u641c\u7d22\r\n# 3. \u6027\u80fd\u654f\u611f\u7684\u5e94\u7528\r\n# 4. \u6279\u91cf\u5904\u7406\u5927\u91cf\u641c\u7d22\u8bf7\u6c42\r\n\r\nfrom everytools import Search\r\n\r\n# \u9ad8\u9891\u641c\u7d22\u793a\u4f8b\r\ndef quick_search(keyword):\r\n    search = Search(keyword)\r\n    search.execute()\r\n    return search.get_results()\r\n\r\n# \u2705 \u63a8\u8350\u4f7f\u7528SearchBuilder\u7c7b\u7684\u573a\u666f\uff1a\r\n# 1. \u590d\u6742\u67e5\u8be2\u6761\u4ef6\u7ec4\u5408\r\n# 2. \u9700\u8981\u591a\u79cd\u8fc7\u6ee4\u5668\r\n# 3. \u4ee3\u7801\u53ef\u8bfb\u6027\u8981\u6c42\u9ad8\r\n# 4. \u4e00\u6b21\u6027\u67e5\u8be2\u4efb\u52a1\r\n\r\nfrom everytools import SearchBuilder, FileFilter, DateFilter\r\n\r\n# \u590d\u6742\u67e5\u8be2\u793a\u4f8b\r\ndef complex_search():\r\n    return (\r\n        SearchBuilder()\r\n        .keywords(\"project\")\r\n        .filter(FileFilter().with_extensions(\"py\", \"js\"))\r\n        .filter(DateFilter().modified_after(\"2024-01-01\"))\r\n        .sort_by(SortType.DATE_MODIFIED_DESCENDING)\r\n        .limit(50)\r\n        .execute()\r\n        .get_results()\r\n    )\r\n```\r\n\r\n**\u6027\u80fd\u4f18\u5316\u6280\u5de7\uff1a**\r\n\r\n```python\r\n# 1. \u590d\u7528Search\u5b9e\u4f8b\r\nsearch = Search(\"\")\r\nfor keyword in [\"python\", \"java\", \"javascript\"]:\r\n    search._query_string = keyword\r\n    search.execute()\r\n    results = search.get_results()\r\n    # \u5904\u7406\u7ed3\u679c...\r\n\r\n# 2. \u9884\u8bbe\u5e38\u7528\u641c\u7d22\u914d\u7f6e\r\ndef create_optimized_search(query):\r\n    return Search(\r\n        query_string=query,\r\n        max_results=100,  # \u9650\u5236\u7ed3\u679c\u6570\u91cf\r\n        request_flags=RequestFlag.FILE_NAME | RequestFlag.PATH  # \u53ea\u8bf7\u6c42\u5fc5\u8981\u4fe1\u606f\r\n    )\r\n\r\n# 3. \u6279\u91cf\u5904\u7406\r\ndef batch_search(keywords, batch_size=10):\r\n    results = {}\r\n    for i in range(0, len(keywords), batch_size):\r\n        batch = keywords[i:i+batch_size]\r\n        for keyword in batch:\r\n            search = Search(keyword)\r\n            search.execute()\r\n            results[keyword] = search.get_results()\r\n    return results\r\n```\r\n\r\n#### \u4f7f\u7528\u8fc7\u6ee4\u5668\r\n\r\neverytools\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u8fc7\u6ee4\u5668\u6765\u7cbe\u786e\u63a7\u5236\u641c\u7d22\u7ed3\u679c\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter, FolderFilter, MediaFilter, DocumentFilter, DateFilter, SizeFilter\r\n\r\n# \u6587\u4ef6\u8fc7\u6ee4\u5668 - \u641c\u7d22\u5927\u4e8e1MB\u7684Python\u6587\u4ef6\r\npython_files = FileFilter().with_extensions(\"py\").with_size_range(min_size=1024*1024)\r\n\r\n# \u6587\u4ef6\u5939\u8fc7\u6ee4\u5668 - \u641c\u7d22\u7a7a\u6587\u4ef6\u5939\r\nempty_folders = FolderFilter().empty_only()\r\n\r\n# \u5a92\u4f53\u8fc7\u6ee4\u5668 - \u641c\u7d22\u56fe\u7247\u6587\u4ef6\r\nimages = MediaFilter(\"image\")  # \u652f\u6301 \"audio\", \"video\", \"image\", \"all\"\r\n\r\n# \u6587\u6863\u8fc7\u6ee4\u5668 - \u641c\u7d22Office\u6587\u6863\r\ndocuments = DocumentFilter(\"office\")  # \u652f\u6301 \"office\", \"pdf\", \"text\", \"all\"\r\n\r\n# \u65e5\u671f\u8fc7\u6ee4\u5668 - \u641c\u7d22\u6700\u8fd1\u4fee\u6539\u7684\u6587\u4ef6\r\nrecent_files = DateFilter().modified_after(\"2024-01-01\")\r\n\r\n# \u5927\u5c0f\u8fc7\u6ee4\u5668 - \u641c\u7d22\u5927\u6587\u4ef6\r\nlarge_files = SizeFilter().larger_than_mb(100)  # \u5927\u4e8e100MB\r\n\r\n# \u7ec4\u5408\u591a\u4e2a\u8fc7\u6ee4\u5668\r\nsearch = (\r\n    SearchBuilder()\r\n    .keywords(\"project\")\r\n    .filter(python_files)\r\n    .filter(recent_files)\r\n    .sort_by(SortType.DATE_MODIFIED_DESCENDING)\r\n    .execute()\r\n)\r\n```\r\n\r\n##### \u8fc7\u6ee4\u5668\u8be6\u7ec6\u8bf4\u660e\r\n\r\n**FileFilter\uff08\u6587\u4ef6\u8fc7\u6ee4\u5668\uff09**\r\n```python\r\nfile_filter = (\r\n    FileFilter()\r\n    .with_extensions(\"py\", \"txt\", \"md\")  # \u6307\u5b9a\u6587\u4ef6\u6269\u5c55\u540d\r\n    .with_size_range(min_size=1024, max_size=1024*1024)  # \u6587\u4ef6\u5927\u5c0f\u8303\u56f4\r\n    .with_content(\"TODO\")  # \u641c\u7d22\u6587\u4ef6\u5185\u5bb9\uff08\u4ec5\u6587\u672c\u6587\u4ef6\uff09\r\n    .duplicates_only()  # \u4ec5\u663e\u793a\u91cd\u590d\u6587\u4ef6\r\n)\r\n```\r\n\r\n**DateFilter\uff08\u65e5\u671f\u8fc7\u6ee4\u5668\uff09**\r\n```python\r\ndate_filter = (\r\n    DateFilter()\r\n    .by_modified_date()  # \u6309\u4fee\u6539\u65e5\u671f\u8fc7\u6ee4\r\n    .in_range(\"2024-01-01\", \"2024-12-31\")  # \u65e5\u671f\u8303\u56f4\r\n)\r\n\r\n# \u4fbf\u6377\u65b9\u6cd5\r\nrecent_created = DateFilter().created_after(\"2024-06-01\")\r\nrecent_modified = DateFilter().modified_after(\"2024-06-01\")\r\n```\r\n\r\n**SizeFilter\uff08\u5927\u5c0f\u8fc7\u6ee4\u5668\uff09**\r\n```python\r\nsize_filter = (\r\n    SizeFilter()\r\n    .larger_than_mb(10)  # \u5927\u4e8e10MB\r\n    .smaller_than_gb(1)  # \u5c0f\u4e8e1GB\r\n)\r\n```\r\n\r\n#### \u5f02\u6b65\u641c\u7d22\r\n\r\n```python\r\nfrom everytools import SearchBuilder\r\n\r\n# \u521b\u5efa\u4e00\u4e2a\u5f02\u6b65\u641c\u7d22\r\nsearch = SearchBuilder().keywords(\"large files\").execute(async_query=True)\r\n\r\n# \u7b49\u5f85\u641c\u7d22\u5b8c\u6210\r\nif search.wait_for_completion(timeout_ms=5000):\r\n    results = search.get_results()\r\n    print(f\"\u627e\u5230 {len(results)} \u4e2a\u7ed3\u679c\")\r\nelse:\r\n    print(\"\u641c\u7d22\u8d85\u65f6\uff01\")\r\n```\r\n\r\n### \u4f20\u7edfAPI (\u5411\u540e\u517c\u5bb9)\r\n\r\n\u4e3a\u4e86\u517c\u5bb9\u65e7\u7248\u672c\uff0c\u6211\u4eec\u7ee7\u7eed\u4fdd\u7559\u4e86\u4f20\u7edfAPI\uff1a\r\n\r\n```python\r\n# \u5bfc\u5165EveryTools\u7c7b\r\nfrom everytools import EveryTools\r\n\r\nes = EveryTools()  # \u5b9e\u4f8b\u5316\uff0c\u53ea\u9700\u8981\u7b2c\u4e00\u6b21\u5c31\u884c\r\n```\r\n\r\n#### \u7528\u540d\u79f0\u641c\u7d22\r\n\r\n\u4f7f\u7528`search()`\u65b9\u6cd5\u53ef\u4ee5\u901a\u8fc7\u8f93\u5165\u5173\u952e\u8bcd\u68c0\u7d22\u6587\u4ef6\uff0c\u4e00\u822c\u5728\u51e0\u79d2\u5185\u80fd\u7ed3\u675f\uff0c\u68c0\u7d22\u5b8c\u540e\u53ef\u4ee5\u8bfb\u53d6\u7ed3\u679c\u6570\u91cf\u3002\r\n\r\n```python\r\nes.search('\u5de5\u4f5c')\r\nprint('everything reuslt number:', es.get_num_total_results())  # \u83b7\u53d6\u641c\u7d22\u7ed3\u679c\u5bf9\u8c61\u6570\u91cf\r\n```\r\n\r\n#### \u83b7\u53d6\u641c\u7d22\u6570\u91cf\r\n\r\n\u641c\u7d22\u540e\u53ef\u4ee5\u83b7\u5f97\u7684\u6570\u91cf\u6709\u4e09\u79cd\uff1a\u7ed3\u679c\u603b\u6570\u91cf\u3001\u6587\u4ef6\u6570\u91cf\u3001\u6587\u4ef6\u5939\u6570\u91cf\u3002\r\n\r\n```python\r\nes.get_num_total_results()  #\u603b\u6570\u91cf\r\nes.get_num_total_file()  # \u6587\u4ef6\u6570\u91cf\r\nes.get_num_total_folder()  # \u6587\u4ef6\u5939\u6570\u91cf\r\n```\r\n\r\n#### \u83b7\u53d6\u641c\u7d22\u7ed3\u679c\r\n\r\n\u4f7f\u7528`results()`\u83b7\u53d6\u641c\u7d22\u7ed3\u679c\uff0c\u8be5\u8fd4\u56de\u4e3a\u8fed\u4ee3\u5668\u3002\u8f93\u51fa\u7ed3\u679c\u4f1a\u5305\u542bname, path\u7b49\u4fe1\u606f\uff0c\u7531\u4e8e\u68c0\u7d22\u4fe1\u606f\u9700\u8981\u8017\u4e00\u5b9a\u65f6\u95f4\uff0c\u6570\u91cf\u6bd4\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u7b49\u5f85\u7247\u523b\u3002\r\n\r\n```python\r\nresults = es.results()  # \u83b7\u53d6\u8f93\u51fa\u7ed3\u679c\r\n\r\n# \u53ea\u6253\u5370\u524d\u4e94\u4e2a\u7ed3\u679c\r\nfor i, result in enumerate(results):\r\n    if i >= 5:\r\n        break\r\n    print(result)\r\n```\r\n\r\n#### \u66f4\u6539\u7ed3\u679c\u6392\u5e8f\r\n\r\n\u66f4\u6539`results`\u65b9\u6cd5`sort_type`\u53c2\u6570\u5b9e\u73b0\u66f4\u6539\u6392\u5e8f\u7ed3\u679c\uff0c\u9ed8\u8ba4\u53c2\u6570\u4e3a`1`\uff0c\u5176\u4ed6\u53c2\u6570\u5982\u4e0b\uff1a\r\n\r\n| **\u6392\u5e8f\u7c7b\u578b** | **\u503c** |\r\n| :----------: | :----: |\r\n|   \u540d\u79f0\u5347\u5e8f   |   1    |\r\n|   \u540d\u79f0\u964d\u5e8f   |   2    |\r\n|   \u8def\u5f84\u5347\u5e8f   |   3    |\r\n|   \u8def\u5f84\u964d\u5e8f   |   4    |\r\n|   \u5927\u5c0f\u5347\u5e8f   |   5    |\r\n|   \u5927\u5c0f\u964d\u5e8f   |   6    |\r\n|  \u62d3\u5c55\u540d\u5347\u5e8f  |   7    |\r\n|  \u62d3\u5c55\u540d\u964d\u5e8f  |   8    |\r\n\r\n#### \u5feb\u901f\u641c\u7d22\u65b9\u6cd5\r\n\r\n```python\r\nes.search_audio()  # \u641c\u7d22\u97f3\u9891\r\nes.search_zip()  # \u641c\u7d22\u538b\u7f29\u5305\r\nes.search_doc()  # \u641c\u7d22\u6587\u6863\r\nes.search_exe()  # \u641c\u7d22\u53ef\u6267\u884c\u6587\u4ef6\r\nes.search_folder()  # \u641c\u7d22\u6587\u4ef6\u5939\r\nes.search_pic()  # \u641c\u7d22\u56fe\u7247\r\nes.search_video()  # \u641c\u7d22\u89c6\u9891\r\nes.search_ext(ext='pdf')  # \u641c\u7d22\u6587\u4ef6\u62d3\u5c55\r\nes.search_in_located('C:\\\\Users\\\\')  # \u641c\u7d22\u6307\u5b9a\u6587\u4ef6\u5939\u4e0b\r\n```\r\n\r\n## \u9ad8\u7ea7\u529f\u80fd\r\n\r\n### \u641c\u7d22\u7ed3\u679c\u8be6\u7ec6\u4fe1\u606f\r\n\r\n\u6bcf\u4e2a\u641c\u7d22\u7ed3\u679c\u5305\u542b\u4e30\u5bcc\u7684\u6587\u4ef6\u4fe1\u606f\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder\r\n\r\nsearch = SearchBuilder().keywords(\"example\").limit(1).execute()\r\nresults = search.get_results()\r\n\r\nfor result in results:\r\n    print(f\"\u6587\u4ef6\u540d: {result.name}\")\r\n    print(f\"\u8def\u5f84: {result.path}\")\r\n    print(f\"\u5b8c\u6574\u8def\u5f84: {result.full_path}\")\r\n    print(f\"\u6587\u4ef6\u5927\u5c0f: {result.size} \u5b57\u8282\")\r\n    print(f\"\u521b\u5efa\u65f6\u95f4: {result.date_created}\")\r\n    print(f\"\u4fee\u6539\u65f6\u95f4: {result.date_modified}\")\r\n    print(f\"\u8bbf\u95ee\u65f6\u95f4: {result.date_accessed}\")\r\n    print(f\"\u6587\u4ef6\u6269\u5c55\u540d: {result.extension}\")\r\n    print(f\"\u662f\u5426\u4e3a\u6587\u4ef6: {result.is_file}\")\r\n    print(f\"\u662f\u5426\u4e3a\u6587\u4ef6\u5939: {result.is_folder}\")\r\n    print(f\"\u6587\u4ef6\u5c5e\u6027: {result.attributes}\")\r\n```\r\n\r\n### \u6392\u5e8f\u9009\u9879\r\n\r\neverytools\u652f\u6301\u591a\u79cd\u6392\u5e8f\u65b9\u5f0f\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder, SortType\r\n\r\n# \u6309\u540d\u79f0\u6392\u5e8f\r\nsearch = SearchBuilder().keywords(\"test\").sort_by(SortType.NAME_ASCENDING).execute()\r\n\r\n# \u6309\u5927\u5c0f\u6392\u5e8f\r\nsearch = SearchBuilder().keywords(\"test\").sort_by(SortType.SIZE_DESCENDING).execute()\r\n\r\n# \u6309\u4fee\u6539\u65f6\u95f4\u6392\u5e8f\r\nsearch = SearchBuilder().keywords(\"test\").sort_by(SortType.DATE_MODIFIED_DESCENDING).execute()\r\n```\r\n\r\n**\u53ef\u7528\u7684\u6392\u5e8f\u7c7b\u578b\uff1a**\r\n- `NAME_ASCENDING` / `NAME_DESCENDING` - \u6309\u540d\u79f0\u6392\u5e8f\r\n- `PATH_ASCENDING` / `PATH_DESCENDING` - \u6309\u8def\u5f84\u6392\u5e8f  \r\n- `SIZE_ASCENDING` / `SIZE_DESCENDING` - \u6309\u5927\u5c0f\u6392\u5e8f\r\n- `EXTENSION_ASCENDING` / `EXTENSION_DESCENDING` - \u6309\u6269\u5c55\u540d\u6392\u5e8f\r\n- `DATE_CREATED_ASCENDING` / `DATE_CREATED_DESCENDING` - \u6309\u521b\u5efa\u65f6\u95f4\u6392\u5e8f\r\n- `DATE_MODIFIED_ASCENDING` / `DATE_MODIFIED_DESCENDING` - \u6309\u4fee\u6539\u65f6\u95f4\u6392\u5e8f\r\n- `DATE_ACCESSED_ASCENDING` / `DATE_ACCESSED_DESCENDING` - \u6309\u8bbf\u95ee\u65f6\u95f4\u6392\u5e8f\r\n\r\n### \u9519\u8bef\u5904\u7406\r\n\r\neverytools\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u9519\u8bef\u5904\u7406\u673a\u5236\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder, EverythingError\r\n\r\ntry:\r\n    search = SearchBuilder().keywords(\"test\").execute()\r\n    results = search.get_results()\r\n    print(f\"\u627e\u5230 {len(results)} \u4e2a\u7ed3\u679c\")\r\nexcept EverythingError as e:\r\n    print(f\"\u641c\u7d22\u51fa\u9519: {e}\")\r\nexcept Exception as e:\r\n    print(f\"\u5176\u4ed6\u9519\u8bef: {e}\")\r\n```\r\n\r\n### \u7cfb\u7edf\u4fe1\u606f\u67e5\u8be2\r\n\r\n```python\r\nfrom everytools.core.dll_loader import get_dll_loader\r\n\r\nloader = get_dll_loader()\r\nprint(f\"Everything\u7248\u672c: {loader.version}\")\r\nprint(f\"\u6570\u636e\u5e93\u5df2\u52a0\u8f7d: {loader.is_db_loaded()}\")\r\nprint(f\"\u7ba1\u7406\u5458\u6743\u9650: {loader.is_admin()}\")\r\n```\r\n\r\n## Everything\u641c\u7d22\u8bed\u6cd5\r\n\r\neverytools\u5b8c\u5168\u652f\u6301Everything\u7684\u5f3a\u5927\u641c\u7d22\u8bed\u6cd5\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728\u5173\u952e\u8bcd\u4e2d\u4f7f\u7528\uff1a\r\n\r\n### \u57fa\u672c\u8bed\u6cd5\r\n\r\n```python\r\n# \u901a\u914d\u7b26\r\nSearchBuilder().keywords(\"*.txt\").execute()  # \u6240\u6709txt\u6587\u4ef6\r\nSearchBuilder().keywords(\"test?.doc\").execute()  # test\u540e\u8ddf\u4e00\u4e2a\u5b57\u7b26\u7684doc\u6587\u4ef6\r\n\r\n# \u903b\u8f91\u64cd\u4f5c\u7b26\r\nSearchBuilder().keywords(\"python AND tutorial\").execute()  # \u5305\u542bpython\u548ctutorial\r\nSearchBuilder().keywords(\"python OR java\").execute()  # \u5305\u542bpython\u6216java\r\nSearchBuilder().keywords(\"python NOT tutorial\").execute()  # \u5305\u542bpython\u4f46\u4e0d\u5305\u542btutorial\r\n\r\n# \u8def\u5f84\u641c\u7d22\r\nSearchBuilder().keywords(\"c:\\\\users\\\\\").execute()  # \u5728\u7279\u5b9a\u8def\u5f84\u4e0b\u641c\u7d22\r\nSearchBuilder().keywords(\"parent:c:\\\\users\\\\\").execute()  # \u7236\u76ee\u5f55\u4e3a\u6307\u5b9a\u8def\u5f84\r\n```\r\n\r\n### \u9ad8\u7ea7\u8bed\u6cd5\r\n\r\n```python\r\n# \u6587\u4ef6\u5927\u5c0f\r\nSearchBuilder().keywords(\"size:>1mb\").execute()  # \u5927\u4e8e1MB\u7684\u6587\u4ef6\r\nSearchBuilder().keywords(\"size:1kb..1mb\").execute()  # 1KB\u52301MB\u4e4b\u95f4\u7684\u6587\u4ef6\r\n\r\n# \u65e5\u671f\u641c\u7d22\r\nSearchBuilder().keywords(\"dm:today\").execute()  # \u4eca\u5929\u4fee\u6539\u7684\u6587\u4ef6\r\nSearchBuilder().keywords(\"dc:2024\").execute()  # 2024\u5e74\u521b\u5efa\u7684\u6587\u4ef6\r\nSearchBuilder().keywords(\"dm:>2024/1/1\").execute()  # 2024\u5e741\u67081\u65e5\u540e\u4fee\u6539\u7684\u6587\u4ef6\r\n\r\n# \u6587\u4ef6\u5c5e\u6027\r\nSearchBuilder().keywords(\"attrib:h\").execute()  # \u9690\u85cf\u6587\u4ef6\r\nSearchBuilder().keywords(\"attrib:r\").execute()  # \u53ea\u8bfb\u6587\u4ef6\r\n\r\n# \u6b63\u5219\u8868\u8fbe\u5f0f\r\nSearchBuilder().keywords(\"regex:test\\\\d+\\\\.txt\").use_regex(True).execute()\r\n```\r\n\r\n### \u5e38\u7528\u641c\u7d22\u6a21\u5f0f\r\n\r\n```python\r\n# \u67e5\u627e\u91cd\u590d\u6587\u4ef6\r\nSearchBuilder().keywords(\"dupe:\").execute()\r\n\r\n# \u67e5\u627e\u7a7a\u6587\u4ef6\u5939\r\nSearchBuilder().keywords(\"empty:\").execute()\r\n\r\n# \u67e5\u627e\u5927\u6587\u4ef6\uff08\u524d100\u4e2a\u6700\u5927\u7684\u6587\u4ef6\uff09\r\nSearchBuilder().keywords(\"\").sort_by(SortType.SIZE_DESCENDING).limit(100).execute()\r\n\r\n# \u67e5\u627e\u6700\u8fd1\u4fee\u6539\u7684\u6587\u4ef6\r\nSearchBuilder().keywords(\"dm:today\").sort_by(SortType.DATE_MODIFIED_DESCENDING).execute()\r\n```\r\n\r\n## \u5b9e\u7528\u793a\u4f8b\r\n\r\n### \u5e38\u89c1\u4f7f\u7528\u573a\u666f\r\n\r\n#### 1. \u6e05\u7406\u91cd\u590d\u6587\u4ef6\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter\r\n\r\n# \u67e5\u627e\u91cd\u590d\u6587\u4ef6\r\nduplicates = SearchBuilder().keywords(\"dupe:\").execute().get_results()\r\n\r\nprint(f\"\u627e\u5230 {len(duplicates)} \u4e2a\u91cd\u590d\u6587\u4ef6:\")\r\nfor file in duplicates:\r\n    print(f\"- {file.full_path} ({file.size} bytes)\")\r\n```\r\n\r\n#### 2. \u67e5\u627e\u5927\u6587\u4ef6\u91ca\u653e\u7a7a\u95f4\r\n\r\n```python\r\nfrom everytools import SearchBuilder, SortType\r\n\r\n# \u67e5\u627e\u6700\u5927\u7684100\u4e2a\u6587\u4ef6\r\nlarge_files = (\r\n    SearchBuilder()\r\n    .keywords(\"\")  # \u641c\u7d22\u6240\u6709\u6587\u4ef6\r\n    .sort_by(SortType.SIZE_DESCENDING)\r\n    .limit(100)\r\n    .execute()\r\n    .get_results()\r\n)\r\n\r\nprint(\"\u6700\u5927\u7684\u6587\u4ef6:\")\r\nfor file in large_files[:10]:  # \u663e\u793a\u524d10\u4e2a\r\n    size_mb = file.size / (1024 * 1024) if file.size else 0\r\n    print(f\"- {file.name}: {size_mb:.2f} MB\")\r\n```\r\n\r\n#### 3. \u9879\u76ee\u6587\u4ef6\u7ba1\u7406\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter, DateFilter\r\n\r\n# \u67e5\u627e\u9879\u76ee\u4e2d\u7684Python\u6587\u4ef6\uff0c\u6309\u6700\u8fd1\u4fee\u6539\u65f6\u95f4\u6392\u5e8f\r\nproject_files = (\r\n    SearchBuilder()\r\n    .keywords(\"C:\\\\MyProject\\\\\")  # \u6307\u5b9a\u9879\u76ee\u8def\u5f84\r\n    .filter(FileFilter().with_extensions(\"py\", \"js\", \"html\", \"css\"))\r\n    .filter(DateFilter().modified_after(\"2024-01-01\"))\r\n    .sort_by(SortType.DATE_MODIFIED_DESCENDING)\r\n    .execute()\r\n    .get_results()\r\n)\r\n\r\nprint(\"\u6700\u8fd1\u4fee\u6539\u7684\u9879\u76ee\u6587\u4ef6:\")\r\nfor file in project_files[:20]:\r\n    print(f\"- {file.name} (\u4fee\u6539\u4e8e: {file.date_modified})\")\r\n```\r\n\r\n#### 4. \u5a92\u4f53\u6587\u4ef6\u6574\u7406\r\n\r\n```python\r\nfrom everytools import SearchBuilder, MediaFilter, SizeFilter\r\n\r\n# \u67e5\u627e\u5927\u4e8e50MB\u7684\u89c6\u9891\u6587\u4ef6\r\nlarge_videos = (\r\n    SearchBuilder()\r\n    .filter(MediaFilter(\"video\"))\r\n    .filter(SizeFilter().larger_than_mb(50))\r\n    .sort_by(SortType.SIZE_DESCENDING)\r\n    .execute()\r\n    .get_results()\r\n)\r\n\r\nprint(\"\u5927\u89c6\u9891\u6587\u4ef6:\")\r\nfor video in large_videos:\r\n    size_gb = video.size / (1024 * 1024 * 1024) if video.size else 0\r\n    print(f\"- {video.name}: {size_gb:.2f} GB\")\r\n```\r\n\r\n#### 5. \u7cfb\u7edf\u6e05\u7406\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter\r\n\r\n# \u67e5\u627e\u4e34\u65f6\u6587\u4ef6\r\ntemp_files = (\r\n    SearchBuilder()\r\n    .filter(FileFilter().with_extensions(\"tmp\", \"temp\", \"cache\", \"log\"))\r\n    .filter(DateFilter().modified_after(\"2024-01-01\"))\r\n    .execute()\r\n    .get_results()\r\n)\r\n\r\nprint(f\"\u627e\u5230 {len(temp_files)} \u4e2a\u4e34\u65f6\u6587\u4ef6\")\r\n\r\n# \u67e5\u627e\u7a7a\u6587\u4ef6\u5939\r\nempty_folders = SearchBuilder().keywords(\"empty:\").execute().get_results()\r\nprint(f\"\u627e\u5230 {len(empty_folders)} \u4e2a\u7a7a\u6587\u4ef6\u5939\")\r\n```\r\n\r\n### \u6027\u80fd\u4f18\u5316\u5efa\u8bae\r\n\r\n#### 1. \u4f7f\u7528\u9002\u5f53\u7684\u8fc7\u6ee4\u5668\r\n\r\n```python\r\n# \u597d\u7684\u505a\u6cd5\uff1a\u4f7f\u7528\u5177\u4f53\u7684\u8fc7\u6ee4\u5668\r\nsearch = (\r\n    SearchBuilder()\r\n    .keywords(\"report\")\r\n    .filter(FileFilter().with_extensions(\"pdf\", \"docx\"))\r\n    .filter(DateFilter().modified_after(\"2024-01-01\"))\r\n    .limit(100)  # \u9650\u5236\u7ed3\u679c\u6570\u91cf\r\n    .execute()\r\n)\r\n\r\n# \u907f\u514d\uff1a\u8fc7\u4e8e\u5bbd\u6cdb\u7684\u641c\u7d22\r\n# search = SearchBuilder().keywords(\"\").execute()  # \u4f1a\u8fd4\u56de\u6240\u6709\u6587\u4ef6\r\n```\r\n\r\n#### 2. \u5408\u7406\u4f7f\u7528\u9650\u5236\r\n\r\n```python\r\n# \u5bf9\u4e8e\u5927\u91cf\u7ed3\u679c\uff0c\u4f7f\u7528limit\u9650\u5236\r\nsearch = SearchBuilder().keywords(\"*.txt\").limit(1000).execute()\r\n\r\n# \u6216\u8005\u5206\u6279\u5904\u7406\r\ndef process_search_results(keywords, batch_size=100):\r\n    search = SearchBuilder().keywords(keywords).execute()\r\n    results = search.get_results()\r\n    \r\n    for i in range(0, len(results), batch_size):\r\n        batch = list(results)[i:i+batch_size]\r\n        # \u5904\u7406\u8fd9\u4e00\u6279\u7ed3\u679c\r\n        yield batch\r\n```\r\n\r\n#### 3. \u5f02\u6b65\u641c\u7d22\u5904\u7406\r\n\r\n```python\r\nimport time\r\nfrom everytools import SearchBuilder\r\n\r\ndef search_with_timeout(keywords, timeout_seconds=10):\r\n    search = SearchBuilder().keywords(keywords).execute(async_query=True)\r\n    \r\n    if search.wait_for_completion(timeout_ms=timeout_seconds * 1000):\r\n        return search.get_results()\r\n    else:\r\n        print(\"\u641c\u7d22\u8d85\u65f6\")\r\n        return []\r\n\r\n# \u4f7f\u7528\u793a\u4f8b\r\nresults = search_with_timeout(\"large files\", timeout_seconds=5)\r\n```\r\n\r\n## \u6545\u969c\u6392\u9664\r\n\r\n### \u5e38\u89c1\u95ee\u9898\r\n\r\n#### 1. Everything\u672a\u8fd0\u884c\r\n\r\n```python\r\nfrom everytools.core.dll_loader import get_dll_loader\r\n\r\ntry:\r\n    loader = get_dll_loader()\r\n    if not loader.is_db_loaded():\r\n        print(\"Everything\u6570\u636e\u5e93\u672a\u52a0\u8f7d\uff0c\u8bf7\u786e\u4fddEverything\u6b63\u5728\u8fd0\u884c\")\r\nexcept Exception as e:\r\n    print(f\"\u65e0\u6cd5\u8fde\u63a5\u5230Everything: {e}\")\r\n    print(\"\u8bf7\u786e\u4fdd\uff1a\")\r\n    print(\"1. Everything\u5df2\u5b89\u88c5\u5e76\u6b63\u5728\u8fd0\u884c\")\r\n    print(\"2. Everything\u670d\u52a1\u5df2\u542f\u52a8\")\r\n    print(\"3. \u5f53\u524d\u7528\u6237\u6709\u8db3\u591f\u6743\u9650\")\r\n```\r\n\r\n#### 2. DLL\u52a0\u8f7d\u5931\u8d25\r\n\r\n```python\r\nimport os\r\nfrom everytools.utils.download import download_sdk_dll\r\n\r\n# \u624b\u52a8\u4e0b\u8f7dDLL\r\ndll_dir = os.path.join(os.path.dirname(__file__), \"everytools\", \"dll\")\r\ntry:\r\n    download_sdk_dll(dll_dir)\r\n    print(\"DLL\u4e0b\u8f7d\u6210\u529f\")\r\nexcept Exception as e:\r\n    print(f\"DLL\u4e0b\u8f7d\u5931\u8d25: {e}\")\r\n```\r\n\r\n#### 3. \u641c\u7d22\u7ed3\u679c\u4e3a\u7a7a\r\n\r\n```python\r\nfrom everytools import SearchBuilder\r\n\r\nsearch = SearchBuilder().keywords(\"test\").execute()\r\nresults = search.get_results()\r\n\r\nif len(results) == 0:\r\n    print(\"\u641c\u7d22\u7ed3\u679c\u4e3a\u7a7a\uff0c\u53ef\u80fd\u7684\u539f\u56e0\uff1a\")\r\n    print(\"1. \u641c\u7d22\u5173\u952e\u8bcd\u4e0d\u5b58\u5728\")\r\n    print(\"2. Everything\u7d22\u5f15\u672a\u5b8c\u6210\")\r\n    print(\"3. \u641c\u7d22\u8def\u5f84\u4e0d\u5728\u7d22\u5f15\u8303\u56f4\u5185\")\r\n    \r\n    # \u5c1d\u8bd5\u66f4\u5bbd\u6cdb\u7684\u641c\u7d22\r\n    broad_search = SearchBuilder().keywords(\"*\").limit(10).execute()\r\n    broad_results = broad_search.get_results()\r\n    print(f\"\u5bbd\u6cdb\u641c\u7d22\u627e\u5230 {len(broad_results)} \u4e2a\u7ed3\u679c\")\r\n```\r\n\r\n## \u5176\u4ed6\u65b9\u6cd5\r\n\r\n### \u67e5\u770b\u7248\u672c\u4fe1\u606f\r\n\r\n```python\r\n# \u65b0API\u65b9\u5f0f\r\nfrom everytools.core.dll_loader import get_dll_loader\r\nloader = get_dll_loader()\r\nprint(f\"Everything\u7248\u672c: {loader.version}\")\r\n\r\n# \u4f20\u7edfAPI\u65b9\u5f0f\r\nfrom everytools import EveryTools\r\nes = EveryTools()\r\nprint(f\"\u4e3b\u8981\u7248\u672c: {es.major_version}\")\r\nprint(f\"\u6b21\u8981\u7248\u672c: {es.minor_version}\")\r\nprint(f\"\u4fee\u6b63\u7248: {es.revision}\")\r\nprint(f\"\u7f16\u8bd1\u53f7: {es.build_number}\")\r\nprint(f\"\u5b8c\u6574\u7248\u672c: {es.version}\")\r\n```\r\n\r\n![image](images/1.png)\r\n\r\n## \u7248\u672c\u66f4\u65b0\r\n\r\n| **\u7248\u672c** |                          **\u66f4\u65b0\u5185\u5bb9**                          |  **\u65e5\u671f**  |\r\n| :------: | :------------------------------------------------------------: | :--------: |\r\n| 0.2.1 | \u4fee\u590dfilters\u5404\u79cdbug | 2025-07-19 |\r\n| 0.2.0    | \u91cd\u6784\u9879\u76ee\u67b6\u6784\uff0c\u63d0\u4f9b\u65b0\u7684\u73b0\u4ee3API\uff0c\u652f\u6301\u5f02\u6b65\u641c\u7d22\u548c\u66f4\u591a\u8fc7\u6ee4\u529f\u80fd     | 2025-07-19 |\r\n| 0.0.1.4    | \u53bb\u6389\u591a\u4f59\u7684pandas\u6a21\u5757     | 2025-07-06 |\r\n| 0.0.1.2  | \u4fee\u590d\u641c\u7d22\u62d3\u5c55\u4e0d\u751f\u6548\uff0c\u8f93\u51fa\u7ed3\u679c\u65b0\u589e\u62d3\u5c55\u540d\uff0c\u4f18\u5316\u641c\u7d22\u4e3a\u7a7a\u8fd4\u56de\u503c     | 2021-10-06 |\r\n| 0.0.1.1  | \u4fee\u590d\u5b89\u88c5\u65f6\u73af\u5883\u4f9d\u8d56\u8b66\u544a                                         | 2021-09-25 |\r\n| 0.0.1.0  | \u63d0\u4f9beverything\u57fa\u672c\u641c\u7d22\u4ee5\u53ca\u5feb\u901f\u641c\u7d22\u65b9\u6cd5\u3002                       | 2021-09-25 |\r\n\r\n## \u8054\u7cfb\u4f5c\u8005\r\n\r\n**\u4f5c\u8005(author)\uff1aJan Yang**\r\n\r\n**\u90ae\u7bb1(Email)\uff1ayang.jiada@foxmail.com**\r\n\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Python tools for Everything search engine",
    "version": "0.2.2",
    "project_urls": {
        "Homepage": "https://github.com/yangjiada/everytools"
    },
    "split_keywords": [
        "everything",
        " everytools",
        " windows",
        " file",
        " search",
        " file search",
        " everything sdk"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a7318f1941d7080905b3f035fc31e8e8274d60e582b493e80d196b1e23a1cdc9",
                "md5": "c2e1d807972fab84cd67f927a3878e22",
                "sha256": "431551eda275173836870d9d27903e7c4ad41fad1bd2a36bd6809542effe685e"
            },
            "downloads": -1,
            "filename": "everytools-0.2.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c2e1d807972fab84cd67f927a3878e22",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 121174,
            "upload_time": "2025-07-20T00:13:29",
            "upload_time_iso_8601": "2025-07-20T00:13:29.386506Z",
            "url": "https://files.pythonhosted.org/packages/a7/31/8f1941d7080905b3f035fc31e8e8274d60e582b493e80d196b1e23a1cdc9/everytools-0.2.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6c13b005c4aaeb00c531af73adf0ab19b380a537462af260246366f7dbabffab",
                "md5": "639de141b2d7de21d54000ad2afbfd5d",
                "sha256": "732ff51c5e3cbc12c640aff2071703e5c86dcf58ea7e831f7ebbc0f56f62aeed"
            },
            "downloads": -1,
            "filename": "everytools-0.2.2.tar.gz",
            "has_sig": false,
            "md5_digest": "639de141b2d7de21d54000ad2afbfd5d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 135201,
            "upload_time": "2025-07-20T00:13:31",
            "upload_time_iso_8601": "2025-07-20T00:13:31.539404Z",
            "url": "https://files.pythonhosted.org/packages/6c/13/b005c4aaeb00c531af73adf0ab19b380a537462af260246366f7dbabffab/everytools-0.2.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-20 00:13:31",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yangjiada",
    "github_project": "everytools",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "everytools"
}
        
Elapsed time: 1.07578s