Python实现未知扩展名文件的指定名称下载与保存
从JSON下载资源并自定义文件名的实现方案
步骤分解:
- 读取JSON文件,提取自定义文件名(对应JSON的键)和资源URL(对应JSON的值)
- 可靠获取资源的文件扩展名(两种方案,优先用响应头)
- 确保保存目录存在,构造路径后完成下载
1. 读取JSON文件
你的JSON结构里,键正好是你想要的自定义文件名前缀(比如asset1),直接用json模块加载即可:
import json # 加载指定JSON文件 with open("assets.json", "r") as f: assets = json.load(f) # assets会是一个字典:{"asset1": "URL1", "asset2": "URL2"...}
2. 获取文件扩展名
推荐优先用HTTP响应头获取(更准确,适配URL无扩展名或重定向的情况),失败则从URL解析作为 fallback:
方式一:从响应头获取扩展名(推荐)
通过HEAD请求获取资源的Content-Type,再转换为对应扩展名:
import mimetypes from urllib.request import Request, urlopen def get_file_extension(url): try: # 发送HEAD请求,只获取响应头不下载内容 req = Request(url, method="HEAD") with urlopen(req) as resp: content_type = resp.getheader("Content-Type") # 根据MIME类型映射扩展名 extension = mimetypes.guess_extension(content_type) return extension.lstrip(".") if extension else "bin" except Exception: # HEAD请求失败时,从URL路径解析 from urllib.parse import urlparse path = urlparse(url).path parts = path.split(".") return parts[-1] if len(parts) > 1 else "bin"
比如Content-Type: image/png会返回png,application/pdf返回pdf,无匹配时用bin作为默认扩展名
3. 完整下载代码
结合以上步骤,加上目录自动创建逻辑,避免因目录不存在报错:
import json import os import mimetypes from urllib.request import Request, urlopen, urlretrieve from urllib.parse import urlparse def get_file_extension(url): try: req = Request(url, method="HEAD") with urlopen(req) as resp: content_type = resp.getheader("Content-Type") extension = mimetypes.guess_extension(content_type) return extension.lstrip(".") if extension else "bin" except Exception: path = urlparse(url).path parts = path.split(".") return parts[-1] if len(parts) > 1 else "bin" # 自定义保存目录 save_dir = "tmp/output" # 自动创建目录(已存在则不报错) os.makedirs(save_dir, exist_ok=True) # 加载JSON资源列表 with open("assets.json", "r") as f: assets = json.load(f) # 遍历下载每个资源 for custom_name, url in assets.items(): ext = get_file_extension(url) # 构造最终保存路径:自定义名称 + 扩展名 output_path = os.path.join(save_dir, f"{custom_name}.{ext}") # 执行下载 urlretrieve(url, output_path) print(f"已完成下载:{output_path}")
关键细节说明:
os.makedirs(save_dir, exist_ok=True):确保保存目录存在,无需手动创建- 直接用JSON的键作为自定义文件名,完全匹配你的需求
- 双重扩展名获取机制:优先用响应头保证准确性,URL解析作为兜底,兼容更多场景
- 可在
urlretrieve外层添加try-except块,避免单个资源下载失败导致整个脚本终止
内容的提问来源于stack exchange,提问作者ProtocolGuy
相关产品推荐
相关产品推荐

