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

如何用Python脚本将Google Cloud Storage图片URL写入b.json文件

解决方案

1. 先明确JSON目标结构

假设你的b.json是层级嵌套结构,其中需要插入URL的"高亮区域"是每个楼栋对应的image_urls数组,示例结构如下:

{
  "districts": [
    {
      "name": "Central",
      "streets": [
        {
          "name": "Main St",
          "blocks": [
            {
              "blk_no": "101",
              "image_urls": []  // 这里就是需要填充URL的位置
            }
          ]
        }
      ]
    }
  ]
}

2. 生成GCS图片URL的层级映射

结合你已有的GCP存储桶遍历逻辑,先把所有图片按district/street/blk_no层级整理成URL映射:

from google.cloud import storage
import json

# 初始化GCS客户端(Colab中已完成授权的话直接用)
client = storage.Client()
bucket = client.get_bucket("你的存储桶名称")

# 构建层级URL映射:district -> street -> blk_no -> [图片URL列表]
url_hierarchy = {}

for blob in bucket.list_blobs():
    # 跳过空文件夹路径
    if blob.name.endswith('/'):
        continue
    # 拆分路径,确保符合district/street/blk_no/filename.jpg的格式
    path_parts = blob.name.split('/')
    if len(path_parts) != 4:
        continue
    district, street, blk_no, _ = path_parts
    
    # 生成公开访问URL(私有桶看下方补充)
    img_url = f"https://storage.googleapis.com/{bucket.name}/{blob.name}"
    
    # 填充层级映射
    if district not in url_hierarchy:
        url_hierarchy[district] = {}
    if street not in url_hierarchy[district]:
        url_hierarchy[district][street] = {}
    if blk_no not in url_hierarchy[district][street]:
        url_hierarchy[district][street][blk_no] = []
    url_hierarchy[district][street][blk_no].append(img_url)

3. 把URL写入b.json的指定区域

读取b.json,遍历其层级结构,将对应楼栋的图片URL填充到目标字段:

# 读取原始JSON文件
with open("b.json", "r") as f:
    json_data = json.load(f)

# 遍历JSON层级,匹配并填充URL
for district_item in json_data["districts"]:
    district_name = district_item["name"]
    if district_name not in url_hierarchy:
        continue
    street_level = url_hierarchy[district_name]
    for street_item in district_item["streets"]:
        street_name = street_item["name"]
        if street_name not in street_level:
            continue
        blk_level = street_level[street_name]
        for blk_item in street_item["blocks"]:
            blk_number = blk_item["blk_no"]
            if blk_number in blk_level:
                # 填充到指定的高亮区域(这里是image_urls字段)
                blk_item["image_urls"] = blk_level[blk_number]

# 保存修改后的JSON
with open("b.json", "w") as f:
    json.dump(json_data, f, indent=2)

4. 私有存储桶的URL处理

如果你的存储桶是私有的,不能用公开URL,需要生成带有效期的签名URL:

from datetime import timedelta

def get_signed_url(blob):
    return blob.generate_signed_url(
        version="v4",
        expiration=timedelta(seconds=3600),  # 有效期1小时
        method="GET"
    )

# 替换之前生成img_url的代码:
img_url = get_signed_url(blob)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:41:06