选择Word文件后Python程序卡顿问题及功能完善咨询
问题解决:批量打开/关闭链接 + 修复Word文件读取卡顿
核心问题拆解
- 卡顿根源:原代码使用
subprocess.run()打开链接,该方法默认会阻塞程序直到每个进程结束,导致打开15个链接时程序卡住无法推进。 - 功能缺失:未实现「关闭上一批次标签页」的核心逻辑,也未支持读取记事本(TXT)文件。
- Word读取漏洞:仅读取插入式超链接,遗漏了直接写在段落文本中的链接。
解决方案
1. 修复卡顿:改用非阻塞方式启动链接
将subprocess.run()替换为subprocess.Popen(),无需等待进程结束即可继续执行程序,彻底解决卡顿问题。
2. 新增记事本文件读取支持
添加TXT文件读取函数,按行提取http/https开头的有效链接。
3. 实现标签页关闭逻辑
记录每批次打开的浏览器进程ID(PID),批次间隔结束后,通过taskkill命令关闭对应PID的进程及子进程,精准关闭当前批次的标签页。
4. 优化Word链接读取
补充读取段落文本中的链接(通过正则匹配http/https开头字符串),并对读取到的链接去重。
完整代码实现
import docx import subprocess import time import re from tkinter import filedialog from tkinter import Tk def read_links_from_word(file_path): document = docx.Document(file_path) links = [] link_pattern = re.compile(r'https?://\S+') for paragraph in document.paragraphs: # 读取插入式超链接 for run in paragraph.runs: for hyperlink in run.hyperlinks: if hyperlink.address: links.append(hyperlink.address) # 读取段落文本中的链接 text_links = link_pattern.findall(paragraph.text) links.extend(text_links) return list(set(links)) # 去重 def read_links_from_txt(file_path): links = [] link_pattern = re.compile(r'https?://\S+') with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if link_pattern.match(line): links.append(line) return links def open_links(links): process_list = [] for link in links: # 非阻塞启动浏览器,记录进程ID proc = subprocess.Popen(["start", "", link], shell=True) process_list.append(proc.pid) return process_list def close_processes(pid_list): if not pid_list: return # Windows下强制关闭进程及子进程 subprocess.run(["taskkill", "/F", "/T", "/PID"] + [str(pid) for pid in pid_list], shell=True) def choose_file(): Tk().withdraw() file_path = filedialog.askopenfilename( title="选择Word或记事本文件", filetypes=[("Word文件", "*.docx"), ("记事本文件", "*.txt")] ) return file_path if __name__ == "__main__": file_path = choose_file() if not file_path: print("未选择文件,程序退出。") else: # 根据文件类型读取链接 if file_path.endswith('.docx'): links = read_links_from_word(file_path) elif file_path.endswith('.txt'): links = read_links_from_txt(file_path) else: print("不支持的文件类型。") exit() if not links: print("未读取到有效链接。") exit() batch_size = 15 interval_between_batches = 600 # 10分钟,单位秒 for i in range(0, len(links), batch_size): batch = links[i:i + batch_size] print(f"正在打开第{i//batch_size + 1}批次,共{len(batch)}个链接...") current_pids = open_links(batch) time.sleep(interval_between_batches) print("正在关闭当前批次标签页...") close_processes(current_pids) print("所有链接批次处理完成。")
关键说明
- 非阻塞启动:
subprocess.Popen()让程序无需等待浏览器响应,快速完成批次链接打开操作。 - 精准关闭:通过PID关闭进程,避免误关其他浏览器窗口;若需针对特定浏览器(如Chrome)关闭,可将
close_processes改为按进程名关闭(如subprocess.run(["taskkill", "/F", "/IM", "chrome.exe"], shell=True))。 - 链接完整性:同时支持Word中的插入式超链接和文本链接,TXT文件仅提取格式合法的链接。
内容的提问来源于stack exchange,提问作者percoder_goat
相关产品推荐
相关产品推荐

