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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:30:11