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
相关产品推荐
相关产品推荐

