#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