python如何快速查找到想要的文档

字多不看版,直接体验

待补充

演示代码

# -*- coding:UTF-8 -*-

# region 导入必要的依赖包
import os
import subprocess
from enum import Enum

模块名 = 'pyperclip'
try:
    import pyperclip  # 需要安装 pyperclip 模块,以支持粘贴板操作
except ImportError as impErr:
    print(f"尝试导入 {模块名} 依赖时检测到异常:{impErr}")
    print(f"尝试安装 {模块名} 模块:")
    try:
        os.system(f"pip install {模块名}")
    except OSError as osErr:
        print(f"尝试安装模块 {模块名} 时检测到异常:{osErr}")
        exit(0)
    else:
        try:
            import pyperclip
        except ImportError as impErr:
            print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")
            exit(0)

模块名 = 'DebugInfo'
try:
    from DebugInfo.DebugInfo import *
except ImportError as impErr:
    print(f"尝试导入 {模块名} 依赖时检测到异常:{impErr}")
    print(f"尝试安装 {模块名} 模块:")
    try:
        os.system(f"pip install {模块名}")
    except OSError as osErr:
        print(f"尝试安装模块 {模块名} 时检测到异常:{osErr}")
        exit(0)
    else:
        try:
            from DebugInfo.DebugInfo import *
        except ImportError as impErr:
            print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")
            exit(0)

模块名 = 'difflib'
try:
    import difflib  # 需要安装 difflib 模块,以支持字符差异对比操作
except ImportError as impErr:
    print(f"尝试导入 {模块名} 依赖时检测到异常:{impErr}")
    print(f"尝试安装 {模块名} 模块:")
    try:
        os.system(f"pip install {模块名}")
    except OSError as osErr:
        print(f"尝试安装模块 {模块名} 时检测到异常:{osErr}")
        exit(0)
    else:
        try:
            import difflib
        except ImportError as impErr:
            print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")
            exit(0)


# endregion


# 定义一个 命令行参数类,用于解析和记录命令行参数

class 文档路径操作结果(Enum):
    参数异常: int = -1
    操作完成: int = 0
    返回上一级: int = 1
    退出程序: int = 2


def 编辑文档(文档路径: str, 搜索接口: 搜索接口基类 = None, 画板: 打印模板 = False):
    画板 = 画板 if isinstance(画板, 打印模板) else 打印模板()
    画板.执行位置(编辑文档)

    文档路径 = str(文档路径 if 文档路径 else '').strip()
    if not os.path.isfile(文档路径):
        return None

    notepad = os.getenv('notepad--')
    if not notepad:
        # 如果 notepad 变量不存在,则尝试搜索 notepad--.exe 程序
        if isinstance(搜索接口, 搜索接口基类) and 搜索接口.可用:
            搜索结果 = 搜索接口.搜索(搜索关键字='notepad--.exe',
                                     搜文档=True,
                                     搜路径=False,
                                     画板=画板.副本)
            if 搜索结果.总数 > 0:
                for 结果 in 搜索结果.结果列表:
                    if 结果.lower().endswith('notepad--.exe'):
                        notepad = 结果
                        break

    if notepad and notepad.lower().endswith('notepad--.exe') and os.path.isfile(notepad):
        # 尝试使用 notepad 来打开路径
        shell指令: str = f'"{notepad}" "{文档路径}"'
        subprocess.Popen(shell指令)
    else:
        # 使用系统默认程序打开路径
        if 在nt系统中():
            os.startfile(文档路径)
        else:
            画板.提示错误('不受支持的操作系统')


def 文档操作(文档列表: str or list[str], 搜索接口: 搜索接口基类, 画板: 打印模板 = None) -> 文档路径操作结果:
    画板 = 画板 if isinstance(画板, 打印模板) else 打印模板()
    画板.执行位置(文档操作)

    if isinstance(文档列表, str):
        文档列表 = (文档列表 if 文档列表 else '').strip()
        if not (文档列表 and os.path.isfile(文档列表)):
            if not 文档列表:
                画板.提示错误(红字('不存在待操作文档'))
            else:
                画板.提示错误(f'待操作文档不存在: {红字(文档列表)}')
            return 文档路径操作结果.参数异常
    elif isinstance(文档列表, list):
        文档列表 = [文档.strip() for 文档 in 文档列表]
        文档列表 = [文档 for 文档 in 文档列表 if 文档]
        不存在文档列表 = [文档 for 文档 in 文档列表 if not os.path.isfile(文档)]
        if 不存在文档列表:
            if len(不存在文档列表) == 1:
                画板.消息(f'文档不存在: {红字(不存在文档列表[0])}')
            else:
                画板.消息('以下文档不存在:')
                画板.准备表格()
                画板.添加多行(不存在文档列表, 拆分列数=1, 修饰方法=红字).展示表格()
            return 文档路径操作结果.参数异常
    else:
        文档列表 = str(文档列表).strip()
        if not os.path.isfile(文档列表):
            画板.提示错误('待操作文档不存在' + '' if not 文档列表 else f': {红字(文档列表)}')
            return 文档路径操作结果.参数异常

    # 文档列表统一成列表形式
    文档列表 = 文档列表 if isinstance(文档列表, list) else [文档列表]
    if not 文档列表:
        画板.提示错误(红字('不存在待操作文档'))
        return 文档路径操作结果.参数异常

    画板.消息(f'待操作文档是: {绿字(文档列表[0])}')

    操作选项: 交互接口类 = 交互接口类()
    操作选项.添加选项(代号=1, 选项='打开', 备注='调用默认的系统程序打开该文档')
    操作选项.添加选项(代号=1.1, 选项='编辑', 备注='调用notepad来打开指定的文档')
    操作选项.添加选项(代号='del', 选项='删除文档', 备注='删除该文档')
    操作选项.添加选项(选项='-')
    操作选项.添加选项(代号='r', 选项='返回上级操作')

    操作选择 = 操作选项.发起选项交互(输入提示='请选择需要的操作(0: 退出程序):', 画板=画板.副本)
    原文档路径, 原文档名 = os.path.split(文档列表[0])
    if not 原文档路径 and 原文档名:
        原文档路径, 原文档名 = os.path.split(os.path.abspath(文档列表[0]))
    if '0' in 操作选择.代号:
        # 用户要求退出
        return 文档路径操作结果.退出程序
    elif 'r' in 操作选择.代号:
        # 用户要求返回上级操作
        return 文档路径操作结果.返回上一级
    elif '1' in 操作选择.代号:
        # 用户要求打开文档
        try:
            if 在nt系统中():
                os.startfile(文档列表[0])
            elif 在posix系统中():
                subprocess.call(['xdg-open', 文档列表[0]])
            else:
                画板.提示错误('不受支持的操作系统')
        except Exception as exp:
            画板.提示错误(f'打开文档失败: {exp}')
            交互接口类.发起文本交互(输入提示='输入任意字符以退出:', 允许空值=True, 画板=画板.副本)
        finally:
            return 文档路径操作结果.操作完成
    elif '1.1' in 操作选择.代号:
        # 用户要求编辑文档
        编辑文档(文档路径=文档列表[0], 搜索接口=搜索接口, 画板=画板.副本)
        return 文档路径操作结果.操作完成
    elif 'del' in 操作选择.代号:
        # 用户要求删除文档
        for 文档 in 文档列表:
            os.system(f'del /q "{文档}"')
        return 文档路径操作结果.操作完成
    else:
        # 不受支持的操作项
        画板.提示错误(f'不受支持的操作: {操作选择.代号}:{操作选择.选项}')
        return 文档路径操作结果.返回上一级


if __name__ == '__main__':
    画板 = 打印模板(False)
    画板.执行位置(__file__)

    everything搜索 = 本地搜索接口类(everything地址='127.0.0.1', everything端口=23)
    while True:
        while True:
            文档选择 = 交互接口类.指定选择文档(输入提示='请输入关键字以定位文档(0: 退出程序):',
                                               搜索接口=everything搜索,
                                               画板=画板.副本)
            if '0' in 文档选择:
                # 用户要求退出
                exit(0)
            操作结果 = 文档操作(文档列表=文档选择, 搜索接口=everything搜索, 画板=画板.副本)
            if 操作结果 in [文档路径操作结果.返回上一级, 文档路径操作结果.参数异常]:
                if 操作结果 is 文档路径操作结果.参数异常:
                    搜索关键字 = ''
                # 用户要求返回本级
                continue
            else:
                exit(0)

以上代码中, 我们定义了一个本地搜索接口类对象,该类通过everything开放的http服务,使用了everything搜索引擎的能力,为文档选择提供了强效的支持,大大提高了用用户定位和选择文档的效率。

关于如何打开everything的http服务,您可以参考:everything开通http服务

以上代码中, 我们通过交互接口类发起了指定选择文档交互,用户可以通过输入关键字快速的定位交选择文档,如下
python如何快速查找到想要的文档_第1张图片

在上图中,用户输入了关键字debuginfo.py,程序通过everything快速的定位出了关键文档供用户选择,我们看到用户选择了6号文档,程序反馈了用户所选择的文档。

提高效率

在上图中,我们看到用户输入的关键字 debuginfo.py 定位到了13个文档,虽然缩小了范围,但还是不甚清晰,区分文档比较困难。

那么,程序支持用户通过符号 来使用多重关键字,如下
python如何快速查找到想要的文档_第2张图片

在上图中,我们看到用户输入了关键字 dyy|appdata|debuginfo.py,程序列出了最匹配的4个候选文档供用户选择,并且程序把用户的关键字都已经标注了颜色,大大提升了用户选择识别文档的效率,提高了交互体验。

小结

这就是今天带来的如何在python中快速定位/选择文档的分享,欢迎大家讨论。

你可能感兴趣的:(DebugInfo,python,python,开发语言,前端)