上一次我們已經知道如何用python擷取ECS資訊了,不知道的可以點 這裡
1.傳回資料格式
通過上回的代碼,我們将會獲得如下的資料(json格式)
{"PageNumber":1,"TotalCount":1,"PageSize":10,"RequestId":"CF15510B-9510-4E04-939B-F48C453D0E62","Instances":{"Instance":[{"ImageId":"centos_7_04_64_20G_alibase_201701015.vhd","VlanId":"","EipAddress":{"IpAddress":"","AllocationId":"","InternetChargeType":""},"ZoneId":"cn-shanghai-b","IoOptimized":true,"SerialNumber":"41b2b827-014b-4723-bcdf-a5764c9d1c2e","Cpu":1,"Memory":2048,"DeviceAvailable":true,"SecurityGroupIds":{"SecurityGroupId":["sg-uf6fq26zc62t0u0t8ftr"]},"SaleCycle":"","AutoReleaseTime":"","OSType":"linux","ResourceGroupId":"","OSName":"CentOS 7.4 64位","InstanceNetworkType":"vpc","HostName":"aliyun-sh","CreationTime":"2018-12-05T06:51Z","RegionId":"cn-shanghai","DeletionProtection":false,"OperationLocks":{"LockReason":[]},"ExpiredTime":"2019-06-05T16:00Z","InnerIpAddress":{"IpAddress":[]},"InstanceTypeFamily":"ecs.n4","InstanceId":"i-uf6gchn2j65r5scbn6rz","NetworkInterfaces":{"NetworkInterface":[{"MacAddress":"00:16:3e:02:0e:a2","PrimaryIpAddress":"172.19.214.188","NetworkInterfaceId":"eni-uf68mu7aigxbcs3huv90"}]},"InternetMaxBandwidthIn":500,"CreditSpecification":"","InternetChargeType":"PayByBandwidth","SpotStrategy":"NoSpot","StoppedMode":"Not-applicable","InternetMaxBandwidthOut":1,"VpcAttributes":{"NatIpAddress":"","PrivateIpAddress":{"IpAddress":["172.19.214.188"]},"VSwitchId":"vsw-uf6a4tfeug6t05akf9w92","VpcId":"vpc-uf6eyafn4cmj5nol253d4"},"SpotPriceLimit":0.0,"StartTime":"2018-12-14T02:33Z","KeyPairName":"哇咔咔的sh密鑰","InstanceName":"哇咔咔的上海ECS","Description":"","PublicIpAddress":{"IpAddress":["47.100.239.99"]},"InstanceType":"ecs.n4.small","Status":"Running","Recyclable":false,"ClusterId":"","GPUSpec":"","GPUAmount":0,"InstanceChargeType":"PrePaid","DedicatedHostAttribute":{"DedicatedHostId":"","DedicatedHostName":""},"DeploymentSetId":""}]}}
稍微排版一下是這樣的
{
"PageNumber":1,
"TotalCount":1,
"PageSize":10,
"RequestId":"04F89A1C-EC73-4F6C-84EE-F2703732DE09",
"Instances":
{
"Instance":
[
{
"ImageId":"centos_7_03_64_20G_alibase_20170818.vhd",
"VlanId":"",
"EipAddress":
{
"IpAddress":"",
"AllocationId":"",
"InternetChargeType":""
},
"ZoneId":"cn-shanghai-b",
"IoOptimized":true,
"SerialNumber":"41b2b827-014b-4723-bcdf-a5764c9d1c2e",
"Cpu":1,
"Memory":2048,
"DeviceAvailable":true,
"SecurityGroupIds":
{
"SecurityGroupId":["sg-uf6fq26zc62t0u0t8ftr"]
},
"SaleCycle":"",
"AutoReleaseTime":"",
"OSType":"linux",
"ResourceGroupId":"",
"OSName":"CentOS 7.3 64位",
"InstanceNetworkType":"vpc",
"HostName":"aliyun",
"CreationTime":"2018-12-05T06:51Z",
"RegionId":"cn-shanghai",
"DeletionProtection":false,
"OperationLocks":{"LockReason":[]},
"ExpiredTime":"2019-06-05T16:00Z",
"InnerIpAddress":{"IpAddress":[]},
"InstanceTypeFamily":"ecs.n4",
"InstanceId":"i-uf6gchn2j65r5scbn6rz",
"NetworkInterfaces":
{
NetworkInterface":
[
{
"MacAddress":"00:16:3e:02:0e:a2",
"PrimaryIpAddress":"172.19.214.188",
"NetworkInterfaceId":"eni-uf68mu7aigxbcs3huv90"
}
]
},
"InternetMaxBandwidthIn":500,
"CreditSpecification":"",
"InternetChargeType":"PayByBandwidth",
"SpotStrategy":"NoSpot",
"StoppedMode":"Not-applicable",
"InternetMaxBandwidthOut":1,
"VpcAttributes":
{
"NatIpAddress":"",
"PrivateIpAddress":
{
"IpAddress":["172.19.214.188"]
},
"VSwitchId":"vsw-uf6a4tfeug6t05akf9w92",
"VpcId":"vpc-uf6eyafn4cmj5nol253d4"
},
"SpotPriceLimit":0.0,
"StartTime":"2018-12-05T06:55Z",
"KeyPairName":"哇咔咔的密鑰",
"InstanceName":"哇咔咔",
"Description":"",
"PublicIpAddress":
{
"IpAddress"["47.100.239.99"]
},
"InstanceType":"ecs.n4.small",
"Status":"Running",
"Recyclable":false,
"ClusterId":"",
"GPUSpec":"",
"GPUAmount":0,
"InstanceChargeType":"PrePaid",
"DedicatedHostAttribute":
{
"DedicatedHostId":"",
"DedicatedHostName":""
},
"DeploymentSetId":""
}
]
}
}
2.資料處理
接下來我們就要用python對這些資料進行處理,恕本人才疏學淺,用了最蠢的方法來處理,直接上代碼:
首先用python中的json.loads方法将擷取到的json資料轉化為字典
dictA=json.loads(response)
之後用for循環将一層一層的字典,清單的嵌套提取出來,并且存儲到一個新的字典裡面去:
dictEnd={}
dictB=dictA['Instances']
listA=dictB['Instance']
dictC=listA[0]
for i in dictC:
if(type(dictC[i])==dict):
dictD=dictC[i]
if(type(dictD)==dict):
for d in dictD:
dictE=dictD[d]
if(type(dictE)==list):
listB=dictE
if listB:
if(type(listB[0])==dict):
dictF=listB[0]
for f in dictF:
dictEnd[f]=dictF[f]
else:
dictEnd[d] = dictD[d]
elif(type(dictE)==dict):
dictG=dictE
else:
dictEnd[d]=dictD[d]
else:
dictEnd[i]=dictC[i]
這樣的話,我們就已經将這個ECS的資訊存儲到diceEnd這個字典裡面了,由于本人決定隻把資料的值的部分輸出到表格中,是以使用以下代碼把剛剛生成的dict轉換為一個list
listC=list(dictEnd.values())
3.輸出到表格
這裡使用openpyxl這個子產品将内容輸出到表格
wb = Workbook()
ws=wb.active
ws.append(listC)
wb.save('txt.xlsx')
4.完整代碼
from aliyunsdkcore.client import AcsClient
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest
from openpyxl import Workbook
import json
#建立AcsClient執行個體
client = AcsClient(
"你的AccessKey",
"你的AccessKey secret",
"地域"
);
# 建立request,并設定參數
request = DescribeInstancesRequest.DescribeInstancesRequest()
request.set_PageSize(10)
# 發起API請求并顯示傳回值
response = client.do_action_with_exception(request)
dictA=json.loads(response)
dictEnd={}
dictB=dictA['Instances']
listA=dictB['Instance']
dictC=listA[0]
for i in dictC:
if(type(dictC[i])==dict):
dictD=dictC[i]
if(type(dictD)==dict):
for d in dictD:
dictE=dictD[d]
if(type(dictE)==list):
listB=dictE
if listB:
if(type(listB[0])==dict):
dictF=listB[0]
for f in dictF:
dictEnd[f]=dictF[f]
else:
dictEnd[d] = dictD[d]
elif(type(dictE)==dict):
dictG=dictE
else:
dictEnd[d]=dictD[d]
else:
dictEnd[i]=dictC[i]
#轉化為list
listC=list(dictEnd.values())
for i in range(len(listC)):
if (type(listC[i])==list):
listC[i]=""
for i in listC:
print(i)
#excel
wb = Workbook()
ws=wb.active
ws.append(listC)
wb.save('txt.xlsx')
以上純屬本人了解,有什麼錯誤的地方還望各位大神指正