You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python批量下载文件并即时完成重命名?

解决Selenium下载文件后即时重命名的问题

我来帮你搞定这个问题!你之前用shutilos.rename失败,大概率是因为文件还没完全下载完成就尝试修改,或者没准确找到刚下载的目标文件。下面是一套经过验证的可行方案:

核心思路

  1. 给Selenium配置单独的下载目录,避免和其他文件混淆;
  2. 等待文件完全下载完成(通过检测临时文件状态或文件大小稳定);
  3. 定位到刚下载的文件,重命名为对应数字。

完整代码实现

首先配置浏览器的下载路径(以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

火山引擎 最新活动