基于Python优化文件资源管理器视频文件自动选择方案问询
问题描述
我正在用PyAutoGUI实现从指定文件夹自动上传视频到网站的功能。点击网站的“选择文件”按钮后会弹出文件资源管理器,但目前的文件选择逻辑依赖方向键定位,稳定性很差,没法用于学校项目展示。
当前的简易代码如下:
pyautogui.hotkey('ctrl', 'f') print("- selecting video number: {}".format(number), end='') pyautogui.write("video{}".format(number)) pyautogui.hotkey('enter') pyautogui.hotkey('down', 'down', 'up', 'left') pyautogui.hotkey('enter')
我需要更健壮、进阶的方案,不管是否结合PyAutoGUI,只要能按文件名或从指定文件夹逐个可靠选择视频即可。
解决方案
方案1:用Selenium直接上传(彻底替代PyAutoGUI)
这是最可靠的方案,完全不需要操作文件资源管理器。通过Selenium直接定位网页的文件上传控件,直接传入文件路径即可:
from selenium import webdriver from selenium.webdriver.common.by import By import os # 初始化浏览器驱动(这里以Chrome为例) driver = webdriver.Chrome() driver.get("你的上传页面URL") # 定位网页中type为file的上传输入框 file_input = driver.find_element(By.XPATH, "//input[@type='file']") # 指定视频文件夹路径,筛选符合命名规则的视频文件 video_folder = "C:/path/to/your/videos" video_files = [ f for f in os.listdir(video_folder) if f.startswith("video") and f.endswith((".mp4", ".avi", ".mov")) ] # 逐个上传视频 for video in video_files: full_file_path = os.path.abspath(os.path.join(video_folder, video)) file_input.send_keys(full_file_path) # 可根据页面逻辑添加上传完成的等待(比如等待“上传成功”提示出现) # time.sleep(3) 或用WebDriverWait等待元素
方案2:PyAutoGUI结合绝对路径输入(轻量改进)
如果必须保留PyAutoGUI的工作流,可以跳过搜索和方向键操作,直接在文件资源管理器的地址栏输入文件绝对路径:
import pyautogui import os import time video_folder = "C:/path/to/your/videos" video_number = 1 video_file = f"video{video_number}.mp4" full_path = os.path.abspath(os.path.join(video_folder, video_file)) # 点击“选择文件”按钮后,等待文件资源管理器弹出 time.sleep(1) # 按Alt+D聚焦地址栏 pyautogui.hotkey('alt', 'd') # 输入完整文件路径 pyautogui.write(full_path) # 回车选中文件 pyautogui.press('enter') # 再次回车确认选择 pyautogui.press('enter')
此方法完全依赖文件路径定位,不受界面布局影响,稳定性远高于方向键操作。
方案3:用pywin32操控文件资源管理器(Windows专属)
针对Windows平台,可以用pywin32调用系统API直接控制文件选择窗口,精准度最高:
import win32gui import win32con import os import time def activate_window(window_title): # 根据窗口标题找到并激活窗口 hwnd = win32gui.FindWindow(None, window_title) if hwnd: win32gui.SetForegroundWindow(hwnd) return hwnd return None def get_file_input_box(parent_hwnd): # 查找文件选择窗口中的文件名输入框 controls = [] def enum_child_callback(child_hwnd, extra): if win32gui.GetClassName(child_hwnd) == "Edit": extra.append(child_hwnd) return True win32gui.EnumChildWindows(parent_hwnd, enum_child_callback, controls) return controls[0] if controls else None # 配置视频路径 video_folder = "C:/path/to/your/videos" video_number = 1 video_file = f"video{video_number}.mp4" full_path = os.path.abspath(os.path.join(video_folder, video_file)) # 点击“选择文件”后等待窗口弹出(窗口标题根据系统语言调整,中文为“打开”) time.sleep(1) dialog_hwnd = activate_window("打开") if dialog_hwnd: input_box_hwnd = get_file_input_box(dialog_hwnd) if input_box_hwnd: # 向输入框写入文件路径 win32gui.SendMessage(input_box_hwnd, win32con.WM_SETTEXT, 0, full_path) # 发送确认指令(模拟点击“打开”按钮) win32gui.SendMessage(dialog_hwnd, win32con.WM_COMMAND, win32con.IDOK, 0)
内容的提问来源于stack exchange,提问作者Lanko321
相关产品推荐
相关产品推荐

