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

Python批量下载图片加表头前缀命名 解决float对象split报错

问题背景

需要批量下载Excel中存储的图片链接,要求将对应列表头作为文件名前缀,初始实现代码如下:

import requests
import itertools
import pandas as pd

lista = pd.read_excel("Link_img_ferplast.xlsx")

lista = lista.values.tolist()
lista2 = list(itertools.chain(*lista))

for img in lista2:
    file_name = (img.split('/')[-1])
    print(f"This is the file name: {file_name}")

    r = requests.get(img, stream=True)

    if r.status_code == 200:

        with open(file_name, 'wb') as f:
            for chunk in r:
                f.write(chunk)
    else:

        broken_images.append(img)

运行时触发报错导致程序中断,报错信息如下:

AttributeError: 'float' object has no attribute 'split'
报错位置为file_name = (img.split('/')[-1])行。

报错原因

pandas读取Excel时,空单元格会被自动解析为NaN,该值类型为float。原代码用itertools.chain将整张表的所有单元格展平为一维列表时,这些空的float类型值也被混入遍历队列,当循环执行到空值时,对float类型调用字符串专属的split()方法就会触发该报错。
除此之外原代码还有两个隐含问题:

  • 未初始化broken_images列表,程序走到下载失败分支时会触发变量未定义错误
  • 直接展平表格的写法丢失了单元格和表头的对应关系,无法实现「表头作为文件名前缀」的初始需求
修复后可直接运行的代码
import requests
import pandas as pd
import os

# 初始化失效链接存储列表
broken_images = []
# 定义图片保存目录,不存在则自动创建
save_folder = "ferplast_images"
os.makedirs(save_folder, exist_ok=True)

# 读取Excel文件
df = pd.read_excel("Link_img_ferplast.xlsx")

# 按列遍历,保留表头信息作为文件名前缀
for header in df.columns:
    # 提取当前列所有非空链接
    col_links = df[header].dropna().tolist()
    for img_url in col_links:
        # 二次校验,跳过非字符串类型的异常值
        if not isinstance(img_url, str):
            continue
        # 提取链接末尾的原始文件名
        raw_filename = img_url.split("/")[-1]
        # 拼接表头前缀生成最终文件名
        final_filename = f"{header}_{raw_filename}"
        save_path = os.path.join(save_folder, final_filename)
        print(f"正在下载:{final_filename}")

        try:
            # 加超时设置避免单个链接卡住整个程序
            resp = requests.get(img_url, stream=True, timeout=15)
            if resp.status_code == 200:
                with open(save_path, "wb") as f:
                    # 按块写入文件,适配大图片下载
                    for chunk in resp.iter_content(chunk_size=2048):
                        f.write(chunk)
            else:
                broken_images.append(img_url)
        except Exception as e:
            print(f"链接{img_url}下载失败,错误信息:{str(e)}")
            broken_images.append(img_url)

print(f"\n下载任务结束,共失效链接{len(broken_images)}个,失效链接列表:{broken_images}")
关键修复点
  • 改为按列遍历DataFrame,保留表头和链接的对应关系,实现表头前缀命名的需求
  • 用dropna()提前过滤空单元格,加上字符串类型校验,从根源避免float类型调用split()的报错
  • 初始化broken_images列表,补上变量未定义的漏洞
  • 增加请求超时、异常捕获逻辑,单个链接下载失败不会中断整个批量任务
  • 增加独立保存目录,下载的图片统一存放不会和其他文件混杂
  • 用iter_content按固定块写入文件,大文件下载更稳定,避免内存占用过高

内容的提问来源于stack exchange,提问作者Matheus Pombo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:48:17