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服务

👆以上代码中, 我们通过交互接口类发起了指定选择文档交互,用户可以通过输入关键字快速的定位交选择文档,如下👇
20231123150941

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

提高效率

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

那么,程序支持用户通过符号 来使用多重关键字,如下👇
20231123151431

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

小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/182459.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

激光雷达与惯导标定 | Lidar_IMU_Init : 编译

激光雷达与惯导标定:Lidar_IMU_Init 编译 功能包安装安装ceres-solver-2.0.0 (注意安装2.2.0不行,必须要安装2.0.0) LI-Init是一种鲁棒、实时的激光雷达惯性系统初始化方法。该方法可校准激光雷达与IMU之间的时间偏移量和外部参数…

【Spring】 IoCDI

回顾 企业命名规范 大驼峰:BookDao(首字母都大写) 类名 小驼峰:bookDao(第一个字母小写) 方法名 蛇形:book_dao(小写下划线_) 数据库 串形:book-dao(小写连字符-) 项目文件夹 各种注解 学习Spring MVC, 其实就是学习各种Web开发需要⽤的到注解 a. RequestMapping: 路由…

(一)C语言之入门:使用Visual Studio Community 2022运行hello world

使用Visual Studio Community 2022运行c语言的hello world 一、下载安装Visual Studio Community 2022 与 新建项目二、编写c helloworld三、编译、链接、运行 c helloworld1. 问题记录:无法打开源文件"stdio.h"2. 问题记录:调试和执行按钮是灰…

Leetcode算法系列| 1. 两数之和(四种解法)

目录 1.题目2.题解解法一:暴力枚举解法二:哈希表解法解法三:双指针(有序状态)解法四:二分查找(有序状态) 1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数…

前端 vue 面试题(二)

文章目录 如何让vue页面重新渲染组件间通信vue为什么要mutation、 action操作插槽、具名插槽、作用域插槽vue编译使用的是什么库?vue怎么实现treeshakingwebpack实现treeshaking为什么只有es module 能支持 tree shaking mixin 的作用mixin的底层原理nexTick原理vue…

小辰的智慧树(差分+前缀和)

登录—专业IT笔试面试备考平台_牛客网 1.考虑总长度之和不能超过m,2考虑限制每棵树高度不能低于ci,如果用二分最短输能截到的高度,还要另外去判断,是否每棵树mid都能严格大于ci ,这样容易超时,换个角度&…

14 redis全量复制与部分复制

1、设置主服务器的地址和端口 首先是在从服务器设置需要同步的主服务器信息,包括机器IP, 端口。 主从复制的开启,完全是在从节点发起的。不需要我们在主节点做任何事情。 从节点开启主从复制,有3种方式 配置文件:在从服务器的配…

使用【画图】软件修改图片像素、比例和大小

打开电脑画图软件,点击开始 windows附件 画图 在画图软件里选择需要调整的照片,点击文件 打开 在弹出窗口中选择照片后点击打开 照片在画图软件中打开后,对照片进行调整。按图中顺序进行 确定后照片会根据设定的值自动调整 保存…

P6 C++控制流语句(continue, break, return)

前言 今天我们讲的是控制流语句,本期内容是上期课程的延续。 控制流语句一般与循环语句一起工作,它们让我们可以更好的控制这些循环的实际运行。 我们有三个主要的控制流语句可以使用,continue 、break 和 return,它们有不同的…

CCFCSP试题编号:201803-2试题名称:碰撞的小球

一、题目描述 二、思路 1.首先妾身分析这个题目,想要解题,得得解决2个问题。 1)判断小球到达端点或碰撞然后改变方向; 2)每时刻都要改变位置 两个问题都比较好解决,1)只要简单判断坐标&…

【Vue】核心特性(响应式)

响应式&#xff1a; 数据变化&#xff0c;视图自动更新 接下来使用一个例子来体现一下什么是响应式 案例一&#xff1a; 访问数据&#xff0c;视图自动更新 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

12个最佳WordPress投票插件

您是否正在为您的网站寻找WordPress投票插件&#xff1f; WordPress投票插件可让您轻松地在您的网站上进行民意调查&#xff0c;用户可以投票。这是在收集见解的同时建立用户参与度的有效策略。 在本文中&#xff0c;我们精心挑选了最好的WordPress投票插件&#xff0c;可帮助…

【C/PTA】函数专项练习(四)

本文结合PTA专项练习带领读者掌握函数&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 6-1 计算A[n]1/(1 A[n-1])6-2 递归实现顺序输出整数6-3 自然数的位数(递归版)6-4 分治法求解金块问题6-5 汉诺塔6-6 重复显示字符(递归版)…

代码随想录算法训练营第五十二天|300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 300.最长递增子序列 class Solution: # 2516 ms, faster than 64.96%def lengthOfLIS(self, nums: List[int]) -> int:n len(nums)dp [1] * n…

黑马点评-10实现用户点赞和点赞排行榜功能

用户点赞功能 如果用户只要点赞一次就对数据库中blog表中的liked字段的值加1就会导致一个用户无限点赞 PutMapping("/like/{id}") public Result likeBlog(PathVariable("id") Long id) {// 修改点赞数量,update tb_blog set liked liked 1 where id …

JavaScript编程基础 – 布尔值(Booleans)

JavaScript编程基础 – 布尔值(Booleans) Javascript Programming Essentials – Booleans 一个JavaScript布尔值包含两个值中的一个&#xff0c;即 true 或者 false。 本文简要介绍JavaScript布尔值的具体应用&#xff0c;以及可能作为对象的布尔值等。 1. 布尔值(Booleans)…

Py之PyPDF2:PyPDF2的简介、安装、使用方法之详细攻略

Py之PyPDF2&#xff1a;PyPDF2的简介、安装、使用方法之详细攻略 目录 PyPDF2的简介 PyPDF2的安装 PyPDF2的使用方法 1、基础用法 PyPDF2的简介 PyPDF2是一个免费的、开源的纯python PDF库&#xff0c;能够拆分、合并、裁剪和转换PDF文件的页面。它还可以为PDF文件添加自定…

springcloud超市管理系统源码

技术说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui mysql 功能介绍&#xff1a; 后台管理&#xff1a; 统计分析&#xff1a;查看用户&#xff0c;商品&#xff0c;销售数量&#xff1b;…

JavaWeb——感谢尚硅谷官方文档

JavaWeb——感谢尚硅谷官方文档 XML一、xml简介二、xml的语法1、文档申明2、xml注释3、xml元素4、xml属性5、xml语法规则 三、xml解析技术1、使用dom4j解析xml Tomcat一、JavaWeb的概念二、web资源的分类三、常见的web服务器四、Tomcat的使用1、安装2、Tomcat的目录介绍3 启动T…

数据结构-leetcode(设计循环队列)

1.学习内容&#xff1a; 今天 我们讲解一道能够很好的总结所学队列知识的题目---设计循环队列 622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 2.题目描述&#xff1a; 让我们设计一个队列 要求是循环的 这和我们的双向链表有些类似 让我们按要求设计出这些相对…