我想从here中检索Azure云中的所有IP地址范围 在json中转换后的数据采用以下格式:
{
"AzurePublicIpAddresses": {
"Region": [
{
...
"IpRange": [
{
"_Subnet": "40.69.96.0/19"
},
{
"_Subnet": "40.86.192.0/18"
}
],
"_Name": "canadaeast"
},
{
"IpRange": [
{
"_Subnet": "13.71.160.0/19"
},
{
"_Subnet": "13.88.224.0/19"
},
{
"_Subnet": "40.85.192.0/18"
}
],
"_Name": "canadacentral"
}
],
"_xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
"_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance"
}
}
我无法访问IP范围?通过这段代码?
with open('AZURE_IP.json') as data_file:
data = json.load(data_file)
list_IPCIDR = []
for i in data["AzurePublicIpAddresses"]:
for ii in i["Region"]:
for j in ii["IpRange"]:
list_IPCIDR.append(i["_Subnet"])
sys.stdout=open("test2.txt","w")
答案 0 :(得分:1)
data["AzurePublicIpAddresses"]
是dict
。直接在dict
上进行迭代只会为您提供dict
的键。
所以
for i in data["AzurePublicIpAddresses"]:
print(i)
将打印
Region
_xmlns:xsd
_xmlns:xsi
按某种顺序。
您可以获得如下的子网IP范围:
list_IPCIDR = []
for ipr in data["AzurePublicIpAddresses"]["Region"]:
for d in ipr["IpRange"]:
list_IPCIDR.append(d["_Subnet"])
print(list_IPCIDR)
<强>输出强>
['40.69.96.0/19', '40.86.192.0/18', '13.71.160.0/19', '13.88.224.0/19', '40.85.192.0/18']
这是有效的,因为data["AzurePublicIpAddresses"]["Region"]
是dict
的列表。每个dict
(临时绑定到名称ipr
)都包含与&#34; IpRange&#34;相关联的dict
列表。 key,所以我们需要迭代内部循环中的那些列表,然后从那些内部dict
中提取子网字符串。
如果你愿意,你可以在列表理解中做到这一点,但我建议将它分成几行,例如:
list_IPCIDR = [d["_Subnet"]
for ipr in data["AzurePublicIpAddresses"]["Region"]
for d in ipr["IpRange"]]
通常需要迭代dict
的(键,值)对。您可以使用.items
方法(或Python 2中的.iteritems
)来实现。例如,
list_IPCIDR = []
for key, val in data["AzurePublicIpAddresses"].items():
if key == "Region":
for dct in val:
for s in dct["IpRange"]:
list_IPCIDR.append(s["_Subnet"])
答案 1 :(得分:0)
AzurePublicIpAddresses
是一本字典,所以:
for i in data["AzurePublicIpAddresses"]:
遍历键(在本例中为字符串)。即你试图做&#34; Region&#34; [&#34; Region&#34;],这是字符串切片。尝试更像:
for i in data["AzurePublicIpAddresses"]:
for ii in data["Azure..."][i]:
# Use ii as it is the contents of the 'Region' attribute
if type(ii) == list: # Sometimes ii is a string, like at the end of your data.
list_IPCIDR.append(ii["IpRange"]["_Subnet"])