Получение ошибки «объект ‘dict’ не вызывается» при попытке записи в Excel с помощью openpyxl

#python #json #dictionary #openpyxl

#python #json #словарь #openpyxl

Вопрос:

Я пытаюсь скопировать словарь, извлеченный из запроса GET API, в Excel с помощью openpyxl; однако код генерирует ошибку «объект ‘dict’, не вызываемый». Вот мой код:

 import requests
from pprint import pprint
from openpyxl import Workbook

r = requests.get('API URL amp; apikey')
data = r.json()
pprint(data)
 

На этом этапе данные возвращаются в виде вложенной библиотеки, например:

 {'results': [{'A':'alpha','B':'beta','C':'gamma'},
             {'D':'delta','E':'epsilon','F':'zeta'}
             ...
             {dictionary n}]
 

Поскольку каждый запрос GET из API приводит к неизвестному количеству вложенных библиотечных объектов, я написал код для разделения и переименования каждой вложенной библиотеки в ее собственную переменную:

 for n, val in enumerate(data['results']):
   globals()["year%d"%n] = val
 

Это приводит к созданию нескольких библиотек, каждая из которых привязана к своей собственной переменной. Все они являются <class ‘dict’> . Я проверяю это, запустив:

 all_variables = dir()
for name in all_variables:
   if not name.startswith('__'):
       myvalue = eval(name)
       print(name, "is", type(myvalue), "and is equal to:")
       print(myvalue)
       print(" ")
 

Что приводит к:

 year1 is <class 'dict'> and is equal to:
   {'A':'alpha','B','beta','C','gamma'}

year2 is <class 'dict'> and is equal to:
   {'D':'delta','E','epsilon','F':'zeta'}

...

yearN is...
 

Вот тут-то и возникает проблема. Когда я пытаюсь записать один из этих новых словарей в Excel с помощью openpyxl, я получаю сообщение об ошибке:

 32. workbook = Workbook()
33. sheet = workbook.active
34. for key,values in year1():
35.     next_row = 1
36.     sheet.cell(column=1 , row=next_row, value=key)
37.     sheet.cell(column=2 , row=next_row, value=values)
38.     next_row  = 1
39.
40. document_name = "yr1"
41. fullfilename = os.path.join(r'filelocation',document_name '.xlsx')
42. workbook.save(fullfilename)
 

Результирующая ошибка выглядит следующим образом:

 line 34, in <module> for key,values in year1():
   TypeError: 'dict' object is not callable
 

Спасибо за любую информацию!

Ответ №1:

Вы имели в виду year1.items() в строке 34?

 for key,values in year1.items():
    next_row = 1
    sheet.cell(column=1 , row=next_row, value=key)
    sheet.cell(column=2 , row=next_row, value=values)
    next_row  = 1
 

Из документации python по методам зацикливания:

При циклическом просмотре словарей ключ и соответствующее значение могут быть получены одновременно с помощью метода items().

 >>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...    print(k, v)
...
gallahad the pure
robin the brave
 

Комментарии:

1. Ух ты, так просто — не могу поверить, что я это пропустил. year1.items() работал отлично. Спасибо тебе @willcrack