Выдача в письменной форме json для файла Excel в python - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь получить json вывод через один из запросов API, который я хотел, а затем загрузить его в файл excel Проблема заключается в ответе, который я получаю от api, если я сбрасываю его в json .dumps () метод, его невозможно разобрать. Но если я попытаюсь разобрать его как текст, а затем попытался отформатировать его json форматировать его разбор Хотя я написал код для записи в csv ниже, но я хотел, чтобы он отличался от файла .. Вот мой пример переменной respone.text в моем фактический код выглядит так:

{
    "value": [
        {
            "correlationId": "xxxxxxxxxx",
            "eventName": {
                "value": "EndRequest",
                "localizedValue": "EndRequest"
            },
            "id": "/subscriptions/xxxxxxxxxx/resourcegroups/xxxxxxxxx/providers/Microsoft.Compute/virtualMachines/xxxxxx/extensions/enablevmaccess/events/xxxxxxxxxx/ticks/xxxxxxxx",
            "level": "Informational",
            "resourceGroupName": "xxxxxx",
            "resourceProviderName": {
                "value": "Microsoft.Compute",
                "localizedValue": "Microsoft.Compute"
            },
            "operationName": {
                "value": "Microsoft.Compute/virtualMachines/extensions/write",
                "localizedValue": "Microsoft.Compute/virtualMachines/extensions/write"
            },
            "status": {
                "value": "Succeeded",
                "localizedValue": "Succeeded"
            },
            "eventTimestamp": "2020-08-06T12:47:02.0657952Z",
            "submissionTimestamp": "2020-08-06T12:49:03.137537Z"
        },
        {
            "correlationId": "xxxxxxxxxx",
            "eventName": {
                "value": "EndRequest",
                "localizedValue": "EndRequest"
            },
            "id": "/subscriptions/xxxxxxxxxx/resourcegroups/xxxxxxxxx/providers/Microsoft.Compute/virtualMachines/xxxxxx/extensions/enablevmaccess/events/xxxxxxxxxx/ticks/xxxxxxxx",
            "level": "Informational",
            "resourceGroupName": "xxxxxx",
            "resourceProviderName": {
                "value": "Microsoft.Compute",
                "localizedValue": "Microsoft.Compute"
            },
            "operationName": {
                "value": "Microsoft.Compute/virtualMachines/extensions/write",
                "localizedValue": "Microsoft.Compute/virtualMachines/extensions/write"
            },
            "status": {
                "value": "Succeeded",
                "localizedValue": "Succeeded"
            },
            "eventTimestamp": "2020-08-06T12:47:02.0657952Z",
            "submissionTimestamp": "2020-08-06T12:49:03.137537Z"
        },
    ]
}

Вот код, который я пытаюсь:

d_date = datetime.datetime.now()
today = d_date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
print(today)

N = 10
date_N_days_ago = datetime.datetime.now() - timedelta(days=N)
start_date = date_N_days_ago.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
print(start_date)

vm_list = compute_client.virtual_machines.list_all()
for vm_general in vm_list:
    general_view = vm_general.id.split("/")
    resource_group = general_view[4]
    print(resource_group)

    BASE_URL = f"https://management.azure.com/subscriptions/{subscription_id}/providers/microsoft.insights/eventtypes/management/values?api-version=2015-04-01&$filter=eventTimestamp ge {start_date} and eventTimestamp le {today} and resourceGroupName eq {resource_group}&$select=eventName,id,resourceGroupName,resourceProviderName,operationName,status,eventTimestamp,correlationId,submissionTimestamp,level"
    
    BASE_URL = BASE_URL
    headers = {
        "Authorization": 'Bearer ' + credential.token["access_token"]
    }
    response = requests.get(BASE_URL, headers=headers)
    
    # if i convert below line to df_json = response.json() it says AttributeError: 'str' object has no attribute 'json'
    df_json = response.text  # this is a string but i am able to parse it properly in json forammter
    
    print(df_json)
    
    with open('c:\csv\logs_test.csv', 'w') as f:
        for key in df_json.keys():
            f.write("%s,%s\n" % (key, df_json[key]))
    break

Я получаю сообщение об ошибке:

AttributeError: 'str' object has no attribute 'keys'

Ожидаемый результат:

Actually I need to to write to xls (excel) format having columns as "correlationId,eventName,id,resourceGroupName,resourceProviderName,operationName,status,eventTimestamp,submissionTimestamp

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Фактически вы можете использовать eval для преобразования текста в словарь, а затем использовать pandas для преобразования его в файл excel.

import pandas

response_dict = eval(response.text)
df = pd.DataFrame(response_dict['value'])
df['tag'] = "Managed by IT"

file_name = 'data.xls'
df.to_excel(file_name, index = False)
1 голос
/ 06 августа 2020

Самый простой - преобразовать в pandas фрейм данных, а затем в xls файл. Вам нужно будет установить xlwt - pip install xlwt.


import pandas as pd

data = {
    "value": [
        {
            "correlationId": "xxxxxxxxxx",
            "eventName": {
                "value": "EndRequest",
                "localizedValue": "EndRequest"
            },
            "id": "/subscriptions/xxxxxxxxxx/resourcegroups/xxxxxxxxx/providers/Microsoft.Compute/virtualMachines/xxxxxx/extensions/enablevmaccess/events/xxxxxxxxxx/ticks/xxxxxxxx",
            "level": "Informational",
            "resourceGroupName": "xxxxxx",
            "resourceProviderName": {
                "value": "Microsoft.Compute",
                "localizedValue": "Microsoft.Compute"
            },
            "operationName": {
                "value": "Microsoft.Compute/virtualMachines/extensions/write",
                "localizedValue": "Microsoft.Compute/virtualMachines/extensions/write"
            },
            "status": {
                "value": "Succeeded",
                "localizedValue": "Succeeded"
            },
            "eventTimestamp": "2020-08-06T12:47:02.0657952Z",
            "submissionTimestamp": "2020-08-06T12:49:03.137537Z"
        },
        {
            "correlationId": "xxxxxxxxxx",
            "eventName": {
                "value": "EndRequest",
                "localizedValue": "EndRequest"
            },
            "id": "/subscriptions/xxxxxxxxxx/resourcegroups/xxxxxxxxx/providers/Microsoft.Compute/virtualMachines/xxxxxx/extensions/enablevmaccess/events/xxxxxxxxxx/ticks/xxxxxxxx",
            "level": "Informational",
            "resourceGroupName": "xxxxxx",
            "resourceProviderName": {
                "value": "Microsoft.Compute",
                "localizedValue": "Microsoft.Compute"
            },
            "operationName": {
                "value": "Microsoft.Compute/virtualMachines/extensions/write",
                "localizedValue": "Microsoft.Compute/virtualMachines/extensions/write"
            },
            "status": {
                "value": "Succeeded",
                "localizedValue": "Succeeded"
            },
            "eventTimestamp": "2020-08-06T12:47:02.0657952Z",
            "submissionTimestamp": "2020-08-06T12:49:03.137537Z"
        }
    ]
}

df = pd.json_normalize(data['value'])
cols = ["correlationId","eventName.value","id","resourceGroupName","resourceProviderName.value","operationName.value","status.value","eventTimestamp","submissionTimestamp"]

df[cols].to_excel("data.xls", index=False)

Вместо json используйте demjson. Установите библиотеку - pip install demjson, потому что json правильно анализирует, только если это правильный json.

import demjson

data = demjson.decode(response.text)

# remaining code goes on
...