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

