字多不看版,直接体验
待补充
演示代码
# -*- 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 pyperclipexcept 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 difflibexcept ImportError as impErr:print(f"再次尝试导入 {模块名} 依赖时检测到异常:{impErr}")exit(0)# endregion# 定义一个 命令行参数类,用于解析和记录命令行参数class 文档路径操作结果(Enum):参数异常: int = -1操作完成: int = 0返回上一级: int = 1退出程序: int = 2def 编辑文档(文档路径: str, 搜索接口: 搜索接口基类 = None, 画板: 打印模板 = False):画板 = 画板 if isinstance(画板, 打印模板) else 打印模板()画板.执行位置(编辑文档)文档路径 = str(文档路径 if 文档路径 else '').strip()if not os.path.isfile(文档路径):return Nonenotepad = 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 = 结果breakif 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 文档路径操作结果.参数异常:搜索关键字 = ''# 用户要求返回本级continueelse:exit(0)
👆以上代码中, 我们定义了一个本地搜索接口类对象,该类通过everything开放的http服务,使用了everything搜索引擎的能力,为文档选择提供了强效的支持,大大提高了用用户定位和选择文档的效率。
关于如何打开everything的http服务,您可以参考:everything开通http服务
👆以上代码中, 我们通过交互接口类发起了指定选择文档交互,用户可以通过输入关键字快速的定位交选择文档,如下👇
在上图👆中,用户输入了关键字debuginfo.py,程序通过everything快速的定位出了关键文档供用户选择,我们看到用户选择了6号文档,程序反馈了用户所选择的文档。
提高效率
在上图👆中,我们看到用户输入的关键字 debuginfo.py 定位到了13个文档,虽然缩小了范围,但还是不甚清晰,区分文档比较困难。
那么,程序支持用户通过符号 | 来使用多重关键字,如下👇
在上图👆中,我们看到用户输入了关键字 dyy|appdata|debuginfo.py,程序列出了最匹配的4个候选文档供用户选择,并且程序把用户的关键字都已经标注了颜色,大大提升了用户选择识别文档的效率,提高了交互体验。
小结
这就是今天带来的如何在python中快速定位/选择文档的分享,欢迎大家讨论。