因此,我正在嘗試通過回傳 JSON 的 api 呼叫匯入 Dynatrace 資料。我將 JSON 匯入為字典和串列(多個嵌套)的字典。
我想要做的是最終得到我以后可以用來寫入 csv 的行。
我認為用例子會更有意義。
匯入 JSON 的示例(縮短空間,但我留下了我需要的 3 個“部分”):
dtrace_results = json.loads(http_response.content)
看起來像:
{'totalCount': 41, 'nextPageKey': None,
'result': [{'metricId': 'builtin:service.response.time',
'data': [{'dimensions': ['SERVICE-039D18D190DF8EE1'],
'dimensionMap': {'dt.entity.service': 'SERVICE-039D18D190DF8EE1'},
'timestamps': [1641491760000, 1641491820000, 1641491880000],
'values': [733, None, 724]},
{'dimensions': ['SERVICE-CF6C91BB030BB3AC'],
'dimensionMap': {'dt.entity.service': 'SERVICE-CF6C91BB030BB3AC'},
'timestamps': [1641491760000, 1641491820000, 1641491880000],
'values': [60951.354609929076, 56788.070796460175, 57866.69565217391]},
{'dimensions': ['SERVICE-BF03689183860CA9'],
'dimensionMap': {'dt.entity.service': 'SERVICE-BF03689183860CA9'},
'timestamps': [1641491760000, 1641491820000, 1641491880000],
'values': [69, 74, 78.5]}
]}]}
經過一些操作以使其更接近我想要的位置:
for row in dtrace_results['result'][0]['data']:
row.pop('dimensions')
列印上述結果:(為清晰起見添加了專案符號)
- {'dimensionmap':{'dt.entity.service':'service-039d18d190df8ee1'},'timestamps':[1641492120000,1641492180000,1641492110000,1641492240000],'值':[沒有,1495.33333333333,1451.5,無]}
- { 'dimensionMap':{ 'dt.entity.service': 'SERVICE-CF6C91BB030BB3AC'}, '時間戳':[1641492060000,1641492120000,1641492180000,1641492240000], '值':[70568.0193548387,64320.80487804878,55929.954545454544,57868.15151515151]}
- {'dimensionMap': {'dt.entity.service': 'SERVICE-BF03689183860CA9'}, 'timestamps': [1641492060000, 1641492120000, 1641492180000, 207s, 16000, 160009, 160009, 160009], 1601, 1601
我試圖從上面得到的基本上是,在這個例子中,上面每行有 4 行,像這樣(添加數字只是為了清楚,結果中不需要):
- SERVICE-039D18D190DF8EE1,1641492060000,無
- SERVICE-039D18D190DF8EE1,1641492120000,1495.3333333333333
- SERVICE-039D18D190DF8EE1,1641492180000,1451.5
- SERVICE-039D18D190DF8EE1,1641492240000,無
- ...后跟附加行
在此先感謝您的幫助。
uj5u.com熱心網友回復:
如果您正在嘗試創建以專案符號給出的串列串列,那么您就快完成了。簡單地迭代dtrace_results['result'][0]['data'](因為它是一個字典串列)并通過zipping 3 個串列通過另一個迭代獲取相關值。請注意,由于row['dimensionMap']['dt.entity.service']不是串列,我們必須將其設為串列。
out = []
for row in dtrace_results['result'][0]['data']:
ts = row['timestamps']
# we need to make 'service' a list of the same length as the other lists
service = [row['dimensionMap']['dt.entity.service']]*len(ts)
vals = row['values']
for zipped in zip(service, ts, vals):
out.append(list(zipped))
輸出:
[['SERVICE-039D18D190DF8EE1', 1641491760000, 733],
['SERVICE-039D18D190DF8EE1', 1641491820000, None],
['SERVICE-039D18D190DF8EE1', 1641491880000, 724],
['SERVICE-CF6C91BB030BB3AC', 1641491760000, 60951.354609929076],
['SERVICE-CF6C91BB030BB3AC', 1641491820000, 56788.070796460175],
['SERVICE-CF6C91BB030BB3AC', 1641491880000, 57866.69565217391],
['SERVICE-BF03689183860CA9', 1641491760000, 69],
['SERVICE-BF03689183860CA9', 1641491820000, 74],
['SERVICE-BF03689183860CA9', 1641491880000, 78.5]]
uj5u.com熱心網友回復:
我認為使用zip并且csv會讓你到達那里。
鑒于您的資料,例如:
data = {
'totalCount': 41,
'nextPageKey': None,
'result': [
{
'metricId': 'builtin:service.response.time',
'data': [
{
'dimensions': ['SERVICE-039D18D190DF8EE1'],
'dimensionMap': {'dt.entity.service': 'SERVICE-039D18D190DF8EE1'},
'timestamps': [1641491760000, 1641491820000, 1641491880000],
'values': [733, None, 724]
},
{
'dimensions': ['SERVICE-CF6C91BB030BB3AC'],
'dimensionMap': {'dt.entity.service': 'SERVICE-CF6C91BB030BB3AC'},
'timestamps': [1641491760000, 1641491820000, 1641491880000],
'values': [60951.354609929076, 56788.070796460175, 57866.69565217391]
},
{
'dimensions': ['SERVICE-BF03689183860CA9'],
'dimensionMap': {'dt.entity.service': 'SERVICE-BF03689183860CA9'},
'timestamps': [1641491760000, 1641491820000, 1641491880000],
'values': [69, 74, 78.5]
},
## many more
]
}
]
}
我們可能會嘗試:
results = []
for item in data["result"][0]["data"]:
dimension = item["dimensions"][0]
for timestamp, value in zip(item["timestamps"], item["values"]):
results.append({
"ID": dimension,
"timestamp": timestamp,
"value": value if value else "None"
})
這將使我們能夠做到:
print(results)
給予:
[
{'ID': 'SERVICE-039D18D190DF8EE1', 'timestamp': 1641491760000, 'value': 733},
{'ID': 'SERVICE-039D18D190DF8EE1', 'timestamp': 1641491820000, 'value': 'None'},
{'ID': 'SERVICE-039D18D190DF8EE1', 'timestamp': 1641491880000, 'value': 724},
{'ID': 'SERVICE-CF6C91BB030BB3AC', 'timestamp': 1641491760000, 'value': 60951.354609929076},
{'ID': 'SERVICE-CF6C91BB030BB3AC', 'timestamp': 1641491820000, 'value': 56788.070796460175},
{'ID': 'SERVICE-CF6C91BB030BB3AC', 'timestamp': 1641491880000, 'value': 57866.69565217391},
{'ID': 'SERVICE-BF03689183860CA9', 'timestamp': 1641491760000, 'value': 69},
{'ID': 'SERVICE-BF03689183860CA9', 'timestamp': 1641491820000, 'value': 74},
{'ID': 'SERVICE-BF03689183860CA9', 'timestamp': 1641491880000, 'value': 78.5}
]
談及results到CSV是那么簡單。
import csv
with open("results.csv", "w", encoding="utf-8", newline="") as file_out:
writer = csv.DictWriter(file_out, fieldnames=results[0].keys())
writer.writeheader()
writer.writerows(results)
給出一個看起來像的 csv:
ID,timestamp,value
SERVICE-039D18D190DF8EE1,1641491760000,733
SERVICE-039D18D190DF8EE1,1641491820000,None
SERVICE-039D18D190DF8EE1,1641491880000,724
SERVICE-CF6C91BB030BB3AC,1641491760000,60951.354609929076
SERVICE-CF6C91BB030BB3AC,1641491820000,56788.070796460175
SERVICE-CF6C91BB030BB3AC,1641491880000,57866.69565217391
SERVICE-BF03689183860CA9,1641491760000,69
SERVICE-BF03689183860CA9,1641491820000,74
SERVICE-BF03689183860CA9,1641491880000,78.5
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/404554.html
標籤:
上一篇:將字典中的值拆分為片段并生成新值
下一篇:讀取json鍵值但忽略物件
