/ / Помилка створення словника з даними API - рядкові індекси повинні бути цілими числами - json, python-3.x

Помилка створення словника з даними API - рядки повинні бути цілими числами - json, python-3.x

У Python3 я створив програму для читання API (з Палати депутатів Бразилії) та отримання даних у форматі JSON:

import requests
url = "https://dadosabertos.camara.leg.br/api/v2/deputados"

# first create a dictionary with the names and links of each deputy
deputados = {}
for pagina in [1, 2, 3, 4, 5, 6]:
parametros = {"formato": "json", "itens": 100, "pagina": pagina}
resposta = requests.get(url, parametros)
for deputado in resposta.json()["dados"]:
deputados[deputado["nome"]] = deputado["uri"]

# then read each link and create a dictionary with the data of each deputy
perfis = {}
for chave, valor in deputados.items():
print(valor)
print(chave)
resposta = requests.get(valor)
for linha in resposta.json()["dados"]:
perfis[chave] = linha["uri"]
perfis[chave]= linha["nomeCivil"]
for linha2 in resposta.json()["ultimoStatus"]:
perfis[chave] = linha2["nomeEleitoral"]
perfis[chave] = linha2["siglaPartido"]
perfis[chave] = linha2["siglaUf"]
perfis[chave]= linha2["urlFoto"]
for linha3 in resposta.json()["ultimoStatus/gabinete"]:
perfis[chave] = linha3["telefone"]
perfis[chave] = linha3["email"]
perfis[chave] = linha3["sexo"]
perfis[chave] = linha3["dataNascimento"]

Але у мене було таке повідомлення про помилку:

https://dadosabertos.camara.leg.br/api/v2/deputados/178957
ABEL MESQUITA JR.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-49-067597090c77> in <module>()
5     resposta = requests.get(valor)
6     for linha in resposta.json()["dados"]:
----> 7         perfis[chave] = linha["uri"]
8         perfis[chave]= linha["nomeCivil"]
9     for linha2 in resposta.json()["ultimoStatus"]:

TypeError: string indices must be integers

Ось приклад даних сторінки:

resposta = requests.get("https://dadosabertos.camara.leg.br/api/v2/deputados/178957")
print(resposta.json())
{"dados": {"id": 178957, "uri": "https://dadosabertos.camara.leg.br/api/v2/deputados/178957", "nomeCivil": "ABEL SALVADOR MESQUITA JUNIOR", "ultimoStatus": {"id": 178957, "uri": "https://dadosabertos.camara.leg.br/api/v2/deputados/178957", "nome": "ABEL MESQUITA JR.", "siglaPartido": "DEM", "uriPartido": "https://dadosabertos.camara.leg.br/api/v2/partidos/36769", "siglaUf": "RR", "idLegislatura": 55, "urlFoto": "http://www.camara.leg.br/internet/deputado/bandep/178957.jpg", "data": "2015-02-01", "nomeEleitoral": "ABEL MESQUITA JR.", "gabinete": {"nome": "248", "predio": "4", "sala": "248", "andar": "2", "telefone": "3215-5248", "email": "dep.abelmesquitajr.@camara.leg.br"}, "situacao": "Exercício", "condicaoEleitoral": "Titular", "descricaoStatus": None}, "cpf": "", "sexo": "M", "urlWebsite": None, "redeSocial": [], "dataNascimento": "1962-03-29", "dataFalecimento": None, "ufNascimento": "RR", "municipioNascimento": "Boa Vista", "escolaridade": "Superior Incompleto"}, "links": [{"rel": "self", "href": "https://dadosabertos.camara.leg.br/api/v2/deputados/178957"}]}

Будь ласка, хтось знає, чому сталася помилка під час створення другого словника та початку його подачі?

Відповіді:

1 для відповіді № 1

Коли ви переглядаєте словник (resposta.json()["dados"]), ітерація за замовчуванням у ключі словника. Тому linha буде id або uriі т. д. Ось чому ви отримуєте string indices must be integers. Мені важко зрозуміти, що ви намагаєтесь зробити, оскільки це не англійською мовою, а якщо ви просто хочете витягти інформацію з json словнику, можливо, ви захочете зробити це:

json_res = reposta.json()
perfis.update(json_res["dados"])
perfis.update(json_res["ultimoStatus"])

1 для відповіді № 2

Проблема полягає в тому, на що вказував Амір Рахум:

З for цикли, ви отримуєте доступ до кожного ключа вашого словника (який є рядком) і трингуєте, щоб індексувати цей рядок іншим рядком: в основному ви дзвоните "id"["uri"].

Ви можете уникнути for цикл і отримати доступ до вашої змінної безпосередньо; щось подібне повинно працювати:

perfis = {}
for chave, valor in deputados.items():
print(valor)
print(chave)
resposta = requests.get(valor)
answer = resposta.json()

perfis.setdefault(chave, {})["uri"] = answer["dados"]["uri"]
perfis.setdefault(chave, {})["nomeCivil"] = answer["dados"]["nomeCivil"]

perfis.setdefault(chave, {})["nomeEleitoral"] = answer["dadultimoStatusos"]["nomeEleitoral"]
perfis.setdefault(chave, {})["siglaPartido"] = answer["dadultimoStatusos"]["siglaPartido"]
perfis.setdefault(chave, {})["siglaUf"] = answer["dadultimoStatusos"]["siglaUf"]
perfis.setdefault(chave, {})["urlFoto"] = answer["dadultimoStatusos"]["urlFoto"]

perfis.setdefault(chave, {})["telefone"] = answer["ultimoStatus/gabinete"]["telefone"]
perfis.setdefault(chave, {})["email"] = answer["ultimoStatus/gabinete"]["email"]
perfis.setdefault(chave, {})["sexo"] = answer["ultimoStatus/gabinete"]["sexo"]
perfis.setdefault(chave, {})["dataNascimento"] = answer["ultimoStatus/gabinete"]["dataNascimento"]