python打开最近关闭的word文件需求解决
2023-04-23
6 min read
1. python关于进程的操作
- os.fork()
- os.getpid()
- ...
初始思路:再打开word的时候托管一个python进程,捕捉用户的word操作日志,记录上一次关闭的窗口
<center>**问题**</center>
1. 获取不到进程中的word的进程名称 -- 因为获取的都是进程数字(或者会有方法 但是我关于window系统/python系统部分的熟悉程度不足)
2. 获取进程也不知道怎么获取word进程中打开的文档名字/地址等信息
=> 意识到了python关于系统的库os
2. 尝试寻找python标准库 - os库中可能会用到的提供的函数
粗略浏览后并没有找到可用的解决方法(也有可能我忽略了)
>还发现了python关于日志的处理 - logging库,但于目标并不相关。
=> 意识到了python可能会有关于支持word操作的库
3. python-docx库
粗略浏览后发现只是通过python向word中写入/读取内容(包括word文字、标题、图片、表格、排版等)
并没有找到可用的思路或者解决方法
=>思路转到word软件本身/windows本身
4. word/windows是怎么恢复上一次打开的文件的?
-> [window怎么查看最近修改/打开的文件?](https://blog.csdn.net/kaige8312/article/details/121898000?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121898000-blog-113621828.235%5Ev28%5Epc_relevant_default_base1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121898000-blog-113621828.235%5Ev28%5Epc_relevant_default_base1&utm_relevant_index=1)
**`recent`**
搜索运行 (win+r ) 输入recent => 发现了最近打开的文件
=> 发现recent文件夹中的文件类型都是.lnk
=> 通过python脚本打开这些快捷方式以恢复最近打开的文件
=> 关键问题:
q1. 这个文件位置在哪里?
q2. python怎么打开文件?
5. 解决关键问题
Q1.
[参考链接](https://zhuanlan.zhihu.com/p/401313556)
-> 复制文件地址
-> "C:\Users\sapph\Recent\新建 文本文档.txt.lnk"
-> 根据复制的地址 并没有看到recent文件夹
-> 实际上在 "C:\\Users\\sapph\\AppData\\Roaming\\Microsoft\\Windows\\Recent"
注意AppData是一个隐藏文件夹
注:不过在文件系统查找还是可以直接使用”C:\Users\sapph\Recent“直接访问到recent文件夹的
Q2.
python的标准os库中提供了相关的函数
>os.open() -> ×
os.system() -> 可以 但是在测试的时候遇到带有空格的文件路径会分开执行,导致bug
> => [subprocess 模块](https://docs.python.org/zh-cn/3/library/subprocess.html#module-subprocess)
仔细阅读并测试得到下面的:
**subprocess.Popon(args[,shell=])**
1. args 应当是一个程序参数的序列或者是一个单独的字符串或 path-like object.
2. 在 Windows,如果 args 是一个序列,他将通过一个在 在 Windows 上将参数列表转换为一个字符串 描述的方式被转换为一个字符串。这是因为底层的 CreateProcess() 只处理字符串。
3. 在 Windows,使用 shell=True,环境变量 COMSPEC 指定了默认 shell。在 Windows 你唯一需要指定 shell=True 的情况是你想要执行内置在 shell 中的命令(例如 dir 或者 copy)。
在运行一个批处理文件或者基于控制台的可执行文件时,不需要 shell=True。
6. 开始规划需求,做出解决方案
6.1 最终解决方案
import subprocess
import os
import time
root_dir = "C:\\Users\\sapph\\%userprofile%\\Roaming\\Microsoft\\Windows\\Recent")
dirs = os.listdir("C:\\Users\\sapph\\%userprofile%\\Roaming\\Microsoft\\Windows\\Recent")
# userprofile修改为自己的
docx_file = []
for filename in dirs:
if filename[-9:] == '.docx.lnk':
docx_file.append(filename)
# print(docx_file)
docx_file_time = {}
for f in docx_file:
filepath = os.path.join(root_dir,f)
open_time = os.path.getatime(filepath) #时间戳
timeStruct = time.localtime(open_time)
open_time = time.strftime('%Y%m%d-%H:%M:%S',timeStruct)
docx_file_time[filepath] = open_time
# print(docx_file_time)
docx_file_time = dict(sorted(docx_file_time.items(),key=lambda item: item[1],reverse=True))
print("排序完成",docx_file_time)
file_list = list(docx_file_time.keys())
for val in file_list[:3]:
print("打开",val)
subprocess.Popen(val,shell=True)
print("启动完成...")
6.2 优化思路
1. 图形界面、
2. 提高自定义水平(使用配置文件xml/yuml/json/ENV等)、
3. 操作的文件种类更多(excel/docs/ppt/txt/pdf)、
4. 根据软件定制(word/特定pdf阅读器/excel)
6.3 打包exe
7. (个人认为)更好的方案/设想/回顾补充
1. 通过托管进程监控用户对于word的操作,记录日志,并保存为链接,下次可以直接打开(更加灵活,可操作性更高,类似Aplue.js)
2. 获取windows日志,可能会有关于word的操作记录,捕捉并解析,记录,下一次打开
3. [使用更加贴近底层的语言(c/c++/java)](https://blog.csdn.net/u014677109/article/details/127444425)
8. others
os.ctermid()
os.getcwd()
os.link()
等...