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

使用urlretrieve()从Excel下载PDF时文件重复覆盖问题求助

搞定PDF下载覆盖问题!

嘿,你遇到的问题完全是嵌套循环在搞鬼——外层循环遍历每个文件名,内层循环又把所有下载链接走一遍,这就导致每个文件名都会被用来保存所有链接的文件,前面的下载结果直接被后面的覆盖了。举个例子:如果有2个文件名A、B和2个链接url1、url2,你的代码会先把url1存成A.pdf,接着马上用url2覆盖A.pdf;然后再把url1存成B.pdf,又用url2覆盖B.pdf。最后你得到的两个文件全是最后一个链接的内容,完全不是你想要的对应关系!

修复后的代码

正确的做法是把文件名和对应的链接一一配对遍历,用Python的zip()函数就能轻松实现这个需求,它会把两个列表里位置对应的元素绑定在一起:

from urllib.request import urlretrieve
from urllib.error import URLError, HTTPError
import os
import xlrd

workbook = xlrd.open_workbook('file.xlsx', on_demand=True)
sheet = workbook.sheet_by_name('Sheet1')
# 提取链接列(第22列,索引从0开始)和文件名列(第3列),从第2行开始跳过表头
listofvalues = sheet.col_values(21, 1)
listofnames = sheet.col_values(2, 1)

# 先检查两个列表长度是否一致,避免出现配对错误
if len(listofvalues) != len(listofnames):
    print("⚠️ 警告:链接数量和文件名数量不匹配,部分内容可能无法正确处理!")

# 同时遍历每个链接和它对应的文件名
for name, value in zip(listofnames, listofvalues):
    try:
        save_dir = 'C:\\results'
        # 自动创建保存目录,避免因目录不存在报错
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        # 拼接完整的保存路径,用f-string更简洁
        full_path = os.path.join(save_dir, f"{name}.pdf")
        urlretrieve(value, full_path)
        print(f"✅ 成功下载:{value} → 保存为 {full_path}")
    except (HTTPError, ValueError, URLError) as e:
        print("------------------------------------")
        print(f"❌ 下载出错:{e}")
        print(f"出错链接:{value}")
        print(f"对应文件名:{name}")
        print("-----------------------------------")
        continue

额外的实用优化

  • 自动创建目录:如果C:\\results不存在,代码会自动生成,不用你手动创建。
  • 长度校验:提前检查链接和文件名的数量是否匹配,避免出现漏存或者配对错误的情况。
  • 更清晰的日志:用表情和格式化字符串让你一眼就能看到下载成功/失败的细节,方便排查问题。

这样修改后,每个链接都会精准对应到你指定的文件名,再也不会出现覆盖的问题啦!

内容的提问来源于stack exchange,提问作者Patrick Holtz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:30:03