2015-10-13 2 views
-1

Я не понимаю, почему я получаю эту ошибку Bytes_Written находится в наборе данных, но почему Python не может найти его? Я получаю эту информацию (см набора данных ниже) из виртуальной машины, я хочу, чтобы выбрать Bytes_Written и bytes_read, а затем вычесть предыдущие значения из текущего значения и распечатать объект JSon как этогоKeyError: 'Bytes_Written' python

{'Bytes_Written': previousValue-currentValue, 'Bytes_Read': previousValue-currentValue} 

вот что данные выглядят так:

{ 
     "Number of Devices": 2, 
     "Block Devices": { 
     "bdev0": { 
      "Backend_Device_Path": "/dev/disk/by-path/ip-192.168.26.1:3260-iscsi-iqn.2010-10.org.openstack:volume-d1c8e7c6-8c77-444c-9a93-8b56fa1e37f2-lun-010.0.0.142", 
      "Capacity": "2147483648", 
      "Guest_Device_Name": "vdb", 
      "IO_Operations": "97069", 
      "Bytes_Written": "34410496", 
      "Bytes_Read": "363172864" 
     }, 
     "bdev1": { 
      "Backend_Device_Path": "/dev/disk/by-path/ip-192.168.26.1:3260-iscsi-iqn.2010-10.org.openstack:volume-b27110f9-41ba-4bc6-b97c-b5dde23af1f9-lun-010.0.0.146", 
      "Capacity": "2147483648", 
      "Guest_Device_Name": "vdb", 
      "IO_Operations": "93", 
      "Bytes_Written": "0", 
      "Bytes_Read": "380928" 
     } 
     } 
    } 

Это полный код, который я использую.

FIELDS = ("Bytes_Written", "Bytes_Read", "IO_Operation") 


def counterVolume_one(state): 
    url = 'http://url' 
    r = requests.get(url) 
    data = r.json() 

    for field in FIELDS: 
     state[field] += data[field] 
    return state 

state = {"Bytes_Written": 0, "Bytes_Read": 0, "IO_Operation": 0} 
while True: 
    counterVolume_one(state) 
    time.sleep(1) 
    for field in FIELDS: 
     print("{field:s}: {count:d}".format(field=field, count=state[field])) 

counterVolume_one(state) 
+0

'data ['Block Devices'] [field]' - ваш словарь находится внутри другого словаря, ключ которого - «Блочные устройства». –

ответ

1

Ваша возвращаемая структура JSON не имеет какого-либо из этих FIELDS = ("Bytes_Written", "Bytes_Read", "IO_Operation") ключей напрямую.

Вам нужно немного изменить свой код.

data = r.json() 

for block_device in data['Block Devices'].iterkeys(): 
    for field in FIELDS: 
     state[field] += int(data['Block Devices'][block_device][field]) 
+0

Большое вам спасибо за это, но он возвращает состояние ошибки [field] + = data ['Block Devices'] [block_device] [field] TypeError: неподдерживаемый тип операндов для + =: 'int' и 'str' – Imo

+0

Обновлен ответ, включающий в себя включение поля блочного устройства в целое число. –