Почему я получаю KeyError при чтении данных с помощью запроса get? - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь использовать этот простой код для чтения данных с веб-сайта, но он дает мне KeyError['p']:

for i in range(25200):

    time.sleep(1)
    with requests.Session() as s:
               data = {'current' : 'afghan_usd' }
               r = s.get('http://call5.tgju.org/ajax.json?2019061716-20190617171520-I4OJ3OcWf4gtpzr3JNC5', json = data ).json()
               #print(r)
    for key, value in r["current"].items():
        last_prices = (r[key]['p'])
        z.append(last_prices)
        mid.append(mean(z)) 

Данное r выглядит так:

{'current': {'afghan_usd': {'p': '154530', 'h': '157260', 'l':
 '154530', 'd': '3640', 'dp': 2.36, 'dt': 'low', 't': '۱۷:۲۷:۰۳',
 't_en': '17:27:03', 't-g': '۱۷:۲۷:۰۳', 'ts': '2019-06-17 17:27:03'}}

И вы можете увидеть полное содержание ответа (r) здесь: https://github.com/rezaee/coursera-test/issues/1

EDIT:

Я отредактировал свой код так:

for i in range(25200):

    time.sleep(1)
    with requests.Session() as s:
               data = {'current' : 'afghan_usd' }#code}
               r = s.get('http://call5.tgju.org/ajax.json?2019061716-20190617171520-I4OJ3OcWf4gtpzr3JNC5', json = data ).json()
               #print(r)

    for key, value in r["current"]["afghan_usd"].items():
        last_prices = float(value.replace("," , ""))
        z.append(last_prices)
        mid.append(mean(z)) 

Но я получаю эту новую ошибку:

AttributeError: у объекта 'float' нет атрибута 'replace'

Ответы [ 3 ]

2 голосов
/ 17 июня 2019

Я думаю, что вы пытаетесь перебрать r["current"]:

for key, value in r["current"].items():
    # for first iteration:
    # key is afghan_usd
    # value is {'p': ....}
    try:
        price = value["p"]
    except TypeError:  # value is a string
        price = value
    last_prices = float(price.replace(',', ''))
    z.append(last_prices)
    mid.append(mean(z))
1 голос
/ 17 июня 2019

Несколько предложений:

Переместите это перед циклом

with requests.Session() as s:

И перед этой строкой есть

data = {'current' : 'afghan_usd' }

Затем сделайте свой цикл и дважды проверьте, что выдоступ на нужном уровне, как это выглядит так:

last_prices = (r[key]['p'])

создает объект, а не простой тип данных.

Убедитесь, что вы правильно сделали отступ в своем коде, как и должно бытьво внешней петле

for key, value in r.items():
0 голосов
/ 17 июня 2019

Вы просматриваете r.items() и получаете «р» от каждого из них. Элемент «текущий» не имеет записи «р».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...