You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

选择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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:20:25