如何使用Python将Azure消费明细JSON响应转换为CSV文件(解决Tags字段为空问题)
问题描述
我正在尝试将Azure Consumption的usageDetails JSON响应转换为CSV文件,需要导出的字段包括id、name、type、kind、tags(保留字典格式)、billingAccountId、resourceName等。我尝试直接转换为DataFrame未成功,编写的Python代码导出的CSV中tags字段为空,希望能修改代码实现正确导出所需字段,同时保留tags的字典格式。
我的原始JSON响应结构(简化示例):
{ "value": [ { "id": "/providers/Microsoft.Billing/Departments/1234/providers/Microsoft.Billing/billingPeriods/201903/providers/Microsoft.Consumption/usageDetails/usageDetails_Id1", "name": "usageDetails_Id1", "type": "Microsoft.Consumption/usageDetails", "kind": "legacy", "tags": { "env": "newcrp", "dev": "tools" }, "properties": { "billingAccountId": "xxxxxxxx", "resourceName": "Resource Name 1", // 其他属性省略 } }, // 更多条目... ] }
我之前的代码:
import pandas as pd frame=pd.DataFrame() for i in range (len(json_output['value'])): df1= pd.DataFrame(data={'kind':json_output['value'][i]['kind'], 'id': json_output['value'][i]['id'], 'tags': json_output['value'][i]['tags'], 'name':json_output['value'][i]['name'], 'type':json_output['value'][i]['type'], 'billingAccountid':json_output['value'][i]['properties']['billingAccountId']},index=[i]) print(df1) frame=frame.append(df1) frame.to_csv('datt.csv')
解决方案
问题出在Pandas默认会将字典类型的字段拆分为多列,且循环使用append(已弃用)的方式也容易导致数据处理异常。我们可以通过将tags转换为JSON字符串来保留其字典结构,同时优化数据处理逻辑:
import pandas as pd import json # 假设你的JSON数据已加载到json_output变量中 # 如果从文件读取: # with open('your_usage_data.json', 'r') as f: # json_output = json.load(f) # 收集处理后的条目 processed_entries = [] for item in json_output['value']: # 整合需要的字段,将tags转为JSON字符串保留结构 entry = { 'id': item['id'], 'name': item['name'], 'type': item['type'], 'kind': item['kind'], 'tags': json.dumps(item['tags']), # 转换为字符串格式保留字典结构 'billingAccountId': item['properties']['billingAccountId'], 'resourceName': item['properties']['resourceName'] } processed_entries.append(entry) # 一次性创建DataFrame(比循环append更高效) usage_df = pd.DataFrame(processed_entries) # 导出CSV,禁用索引列避免冗余数据 usage_df.to_csv('azure_usage_details.csv', index=False)
说明
- 保留Tags结构:使用
json.dumps()将tags字典转为JSON字符串,CSV中会完整显示类似{"env": "newcrp", "dev": "tools"}的结构,后续如需还原字典,可使用json.loads()解析。 - 优化数据处理:先收集所有条目到列表再创建DataFrame,避免了
append方法的弃用问题,同时提升了处理效率。 - 完整提取字段:明确包含了你需要的所有字段,包括
properties中的resourceName和billingAccountId。
内容的提问来源于stack exchange,提问作者kakaji
相关产品推荐
相关产品推荐

