如何将URL图片下载至本地并添加为DataFrame的新列?
解决推特头像下载与DataFrame本地路径匹配问题
核心思路
遍历DataFrame中的每一行,针对每个头像URL完成下载后,直接将本地路径存入新列,利用apply方法自动完成行匹配,无需手动关联。
代码实现(推荐使用requests,更灵活)
import pandas as pd import requests import os from urllib.parse import urlparse # 1. 创建头像保存文件夹(不存在则自动新建) save_dir = "twitter_avatars" os.makedirs(save_dir, exist_ok=True) # 2. 定义下载函数,返回本地路径或失败标记 def download_avatar(img_url, user_id, save_dir): # 用用户ID作为文件名(保证唯一),保留原图片后缀 ext = os.path.splitext(urlparse(img_url).path)[1] filename = f"{user_id}{ext}" local_path = os.path.join(save_dir, filename) try: # 流式下载图片,避免内存占用过高 response = requests.get(img_url, stream=True, timeout=10) response.raise_for_status() # 捕获HTTP请求错误 with open(local_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) return local_path except Exception as e: print(f"用户ID {user_id} 头像下载失败:{str(e)}") return None # 3. 将函数应用到DataFrame,生成本地路径列 # 假设你的原始数据存储在df中 df['local_img_path'] = df.apply(lambda row: download_avatar(row['img_path'], row['id'], save_dir), axis=1)
如果你习惯用wget的替代实现
import pandas as pd import wget import os from urllib.parse import urlparse save_dir = "twitter_avatars" os.makedirs(save_dir, exist_ok=True) def download_avatar_wget(img_url, user_id, save_dir): ext = os.path.splitext(urlparse(img_url).path)[1] filename = f"{user_id}{ext}" local_path = os.path.join(save_dir, filename) try: wget.download(img_url, out=local_path) return local_path except Exception as e: print(f"用户ID {user_id} 头像下载失败:{str(e)}") return None df['local_img_path'] = df.apply(lambda row: download_avatar_wget(row['img_path'], row['id'], save_dir), axis=1)
关键说明
- 用用户
id作为文件名:保证每个文件唯一,避免重名覆盖,同时直接对应原数据行,无需额外匹配逻辑 - 异常处理:单个头像下载失败不会中断整个流程,失败行会标记为
None,后续可单独处理 - 流式下载:针对大图片更友好,避免内存溢出
内容的提问来源于stack exchange,提问作者user17424407
相关产品推荐
相关产品推荐

