用相同的键从json数据中拉出python

时间:2014-05-21 07:28:05

标签: python json

我尝试从其他API中提取数据。问题是密钥具有相同的名称。我写了一个循环来将数据拉入列表,但我知道我有错误

def getsellorders(coin):
    url = "https://bittrex.com/api/v1/public/getorderbook?market=BTC-"+coin+"LTC&type=sell&depth=15"
    response = requests.get(url)
    response.raise_for_status()
    jdata = response.json()
    sells = [0]
    i = 0
    for i in range(15):
        sells[i] = jdata['result']['Quantity']
        sells.append(i)
    return sells

1 个答案:

答案 0 :(得分:0)

使用list.append()自行添加条目;直接在jdata['results']列表上循环:

sells = []
for res in jdata['result']:
    sells.append(res['Quantity'])

您的代码尝试直接分配到sells 中的索引,附加您生成的i整数。但是,密钥jdata['result']['Quantity']不存在,因为jdata['result']是一个列表。这一切只能首先导致KeyError s,然后导致不正确的数据(i)被添加,然后可能IndexErrors,因为您假设总共有15个条目。

您可以使用列表理解进一步简化此操作,并一次性获取所有条目:

def getsellorders(coin):
    url = "https://bittrex.com/api/v1/public/getorderbook"
    params = {'market': "BTC-{}".format(coin), 'type': 'sell', 'depth': '15'}
    response = requests.get(url, params=params)
    response.raise_for_status()
    jdata = response.json()
    return [res['Quantity'] for res in jdata['result']]

我还在params使用requests.get()参数将URL查询编码到库中。

我已将market参数更改为实际的interpet coin作为市场名称的第二部分;只有当coin为空字符串时,您的代码才有效。

演示:

>>> import requests
>>> def getsellorders(coin):
...     url = "https://bittrex.com/api/v1/public/getorderbook"
...     params = {'market': "BTC-{}".format(coin), 'type': 'sell', 'depth': '15'}
...     response = requests.get(url, params=params)
...     response.raise_for_status()
...     jdata = response.json()
...     return [res['Quantity'] for res in jdata['result']]
... 
>>> getsellorders('LTC')
[10.0, 1.10799625, 1.4716218, 0.03364621, 0.21046474, 7.05, 0.25586034, 20.0, 22.15658669, 0.19841088, 1.34172574, 0.01096613, 0.399365, 0.205, 0.10813746]