如何用Python移除或忽略JSON文件中的ipv6Prefix条目?
解决Google Cloud IP范围提取IPv4时的KeyError问题
核心思路
不要在遍历原列表时直接删除元素(会导致遍历逻辑混乱引发错误),而是通过键存在性检查筛选出仅包含IPv4的条目,或者遍历列表副本再修改原列表。
方法一:列表推导式直接筛选(最简洁高效)
直接遍历prefixes数组,只保留包含ipv4Prefix键的条目并提取地址,完全避开IPv6相关条目:
import requests # 获取Google Cloud IP范围数据 response = requests.get("https://www.gstatic.com/ipranges/cloud.json") data = response.json() # 筛选并提取所有IPv4前缀 ipv4_prefixes = [item["ipv4Prefix"] for item in data["prefixes"] if "ipv4Prefix" in item] # 输出结果(按需处理) for prefix in ipv4_prefixes: print(prefix)
方法二:遍历过程中跳过IPv6条目(灵活扩展)
如果需要额外处理逻辑(比如同时收集IPv6地址),可以在遍历时分情况处理:
import requests response = requests.get("https://www.gstatic.com/ipranges/cloud.json") data = response.json() ipv4_prefixes = [] ipv6_prefixes = [] for item in data["prefixes"]: if "ipv4Prefix" in item: ipv4_prefixes.append(item["ipv4Prefix"]) elif "ipv6Prefix" in item: ipv6_prefixes.append(item["ipv6Prefix"]) # 其他类型条目可按需添加处理逻辑
为什么你的删除操作会报错?
你之前用del或dict.pop()时触发错误,大概率是因为遍历原列表的同时修改列表本身(比如删除元素),导致列表长度变化,遍历的索引与实际元素不匹配,进而引发TypeError或索引异常。
如果一定要修改原列表(不推荐,不如直接筛选),可以遍历列表的副本:
# 遍历原列表的副本,修改原列表 for item in data["prefixes"].copy(): if "ipv6Prefix" in item: data["prefixes"].remove(item) # 此时原列表已无IPv6条目,可安全提取IPv4 ipv4_prefixes = [item["ipv4Prefix"] for item in data["prefixes"]]
内容的提问来源于stack exchange,提问作者Hosein Nikkhah
相关产品推荐
相关产品推荐

