如何用Python批量下载文件并即时完成重命名?
解决Selenium下载文件后即时重命名的问题
我来帮你搞定这个问题!你之前用shutil或os.rename失败,大概率是因为文件还没完全下载完成就尝试修改,或者没准确找到刚下载的目标文件。下面是一套经过验证的可行方案:
核心思路
- 给Selenium配置单独的下载目录,避免和其他文件混淆;
- 等待文件完全下载完成(通过检测临时文件状态或文件大小稳定);
- 定位到刚下载的文件,重命名为对应数字。
完整代码实现
首先配置浏览器的下载路径(以Chrome为例),然后实现等待下载的工具函数,最后整合你的遍历逻辑:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import os import time # 1. 配置下载目录(建议用绝对路径,避免路径问题) download_dir = os.path.abspath("./downloads") os.makedirs(download_dir, exist_ok=True) # 自动创建目录,不存在则新建 # 配置Chrome浏览器参数,取消下载弹窗,指定下载路径 chrome_options = Options() chrome_options.add_experimental_option("prefs", { "download.default_directory": download_dir, "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": True }) # 初始化浏览器驱动 driver = webdriver.Chrome(options=chrome_options) # 2. 实现等待下载完成的工具函数 def wait_for_download(download_dir, timeout=30): start_time = time.time() while time.time() - start_time < timeout: # 过滤掉Chrome下载时的临时文件(后缀为.crdownload) completed_files = [f for f in os.listdir(download_dir) if not f.endswith(".crdownload")] if completed_files: # 取目录中最新修改的文件(确保是刚下载的那个) latest_file = max( [os.path.join(download_dir, f) for f in completed_files], key=os.path.getmtime ) # 再等待1秒确保文件写入完成 time.sleep(1) return latest_file time.sleep(0.5) # 超时未完成下载则抛出异常 raise TimeoutError(f"等待下载超时,已超过{timeout}秒") # 3. 整合你的遍历与下载重命名逻辑 # 注意:不要用list作为变量名,这会覆盖Python内置的list类型 num_list = [1,2,3,4,5,6,7,8,9,10,11] for j in num_list: # 你的原有输入数字逻辑 enternum = driver.find_element_by_xpath('xxxx') enternum.click() enternum.send_keys(j) # 补充:触发下载的操作(比如点击下载按钮,你需要替换成实际的元素定位) # driver.find_element_by_xpath("你的下载按钮XPath").click() # 等待当前文件下载完成 downloaded_file = wait_for_download(download_dir) # 生成新文件名:保留原文件后缀,文件名改为对应数字 file_ext = os.path.splitext(downloaded_file)[1] new_file_path = os.path.join(download_dir, f"{j}{file_ext}") # 处理文件已存在的情况(如果重复下载,先删除旧文件) if os.path.exists(new_file_path): os.remove(new_file_path) # 执行重命名 os.rename(downloaded_file, new_file_path) print(f"已完成文件重命名:{new_file_path}") # 关闭浏览器 driver.quit()
关键注意事项
- 不要用
list作为变量名:这是Python的内置类型,会导致语法冲突或逻辑错误; - 等待下载的逻辑:通过检测
.crdownload临时文件后缀,确保文件完全写入磁盘后再操作; - 保留文件后缀:直接重命名为纯数字会丢失文件格式,加上原后缀能保证文件可正常打开;
- 异常处理:如果下载超时,函数会抛出
TimeoutError,你可以根据需求添加捕获逻辑。
内容的提问来源于stack exchange,提问作者not_yet_a_fds




