待补充
# -*- 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服务
以上代码中, 我们通过交互接口类发起了指定选择文档交互,用户可以通过输入关键字快速的定位交选择文档,如下
在上图中,用户输入了关键字debuginfo.py,程序通过everything快速的定位出了关键文档供用户选择,我们看到用户选择了6号文档,程序反馈了用户所选择的文档。
在上图中,我们看到用户输入的关键字 debuginfo.py 定位到了13个文档,虽然缩小了范围,但还是不甚清晰,区分文档比较困难。
在上图中,我们看到用户输入了关键字 dyy|appdata|debuginfo.py,程序列出了最匹配的4个候选文档供用户选择,并且程序把用户的关键字都已经标注了颜色,大大提升了用户选择识别文档的效率,提高了交互体验。
这就是今天带来的如何在python中快速定位/选择文档的分享,欢迎大家讨论。