【问题标题】:Python: Print certain items from an API call that is a list and not a DictPython:从列表而不是字典的 API 调用中打印某些项目
【发布时间】:2019-03-12 23:21:13
【问题描述】:

我正在使用加密货币交换 API,我一直试图让它只从 API 的列表中提取符号和最后一个。如果列表在代码本身中,我找到了许多解决方案,但是我无法从 API 中提取两个所需的项目、字段,无论您想调用什么,但是在检查键时我得到 None。我尝试了许多在本网站和其他人的教程上找到的方法,但一直遇到错误。这是我与 API 对话的代码:

def pull():
    r = requests.get('API_ADDRESS')
    data = r.json()
    print(type(data)) # confirms type is list

输出:类“列表”

这是通过浏览器从页面开头/顶部的 API URL 中的一小部分:

[{"ask":"0.00000019438","bid":"0.00000019436","last":"0.00000019437","open":"0.00000017778","low":"0.00000017500","high":"0.00000020000","volume":"215392000","volumeQuote":"39.177612838","timestamp":"2019-03-12T22:54:35.168Z","symbol":"BCNBTC"},{"ask":"3886.77","bid":"3886.76","last":"3886.76","open":"3868.90","low":"3814.66","high":"3903.39","volume":"33598.51324","volumeQuote":"129840974.9750335","timestamp":"2019-03-12T22:55:44.772Z","symbol":"BTCUSD"},{"ask":"0.023432","bid":"0.023403","last":"0.023404","open":"0.021257","low":"0.021208","high":"0.023639","volume":"78033.270","volumeQuote":"1720.630098144","timestamp":"2019-03-12T22:55:38.179Z","symbol":"DASHBTC"},

根据 API 文档,使用 curl 是如何提取数据的,所以我想知道我是否以错误的方式将其拉下,这是问题的一部分吗?完整列表是所有受支持的以 [ 开头并以 ] 结尾的货币,每种货币以 {} 开头和结尾。

我一直在使用像这样的 API,它们是 dicts 并且有没有问题的键:

{  
   'items':[  
      {  
        'created_on':'2016-11-08',
        'etag':'DELETED',
        'classification':{  
        'type':'charge-description',
        'description':'A registered charge'

我想把符号拉到最后。我能够获取符号或最后打印的唯一方法是在前面添加 [0],但随后只打印列表的第一个条目。我只是在学习 Python,所以我不确定在没有额外代码或冗余代码的情况下完成这项任务的最佳方法。我想尽可能保持清洁。我已经使用上面的核心代码与另一个 API 对话,它是一个 dict 并以结果开头:= 所以很容易提取我想要的数据,但这是我尝试使用的第一个 API JSON 列表,所以我需要一个帮助不大,所以我可以从这个挑战中学习。

我确实尝试过: python getting a list of value from list of dict

但所有列表都在代码本身中,而不是从 API 中提取的列表。作为另一种选择,我从 requests 转移到 pycurl,现在在检查类型时它显示为:

<class 'bytes'>

经过更多研究,我找到了一个解决方案,并在下面发布了我的新工作代码作为答案。

【问题讨论】:

  • 您能否还包括输出应该是什么样的?
  • 您误会了,我问是否需要将列表转换为字典,API 输出是一个列表,我只想从整个列表中提取符号和最后一个,您可以从中看到我的 print(type(data)) 它是一个列表

标签: json api python-3.7


【解决方案1】:

data 视为字典列表。在每个字典中,您只想检索两个 {键:值}对。

因此,您可以对数据中的每个元素执行以下操作:获取所需的两个键值对,并将它们附加到一个新列表中。

    parsed_data = []
    for _dict in data: 
        new_dict = { "symbol": _dict["symbol"], "last": _dict["last"] }
        parsed_data.append(new_dict) 

这应该会按照您所描述的那样返回您想要的数据。

【讨论】:

  • 问题是当我运行打印键时(是的,我知道这不是确切的打印)我没有键,因为它是一个列表
  • 我猜您使用了数据 sn-p 并将其放入列表中,而代码的作用是从 API 中提取,因为我使用您的答案得到以下信息:raise TypeError(f'the JSON object must be str, bytes or bytearray, ' TypeError: the JSON object must be str, bytes or bytearray, not Response
  • 根据您的想法,我如何将数据(API 提取信息)放入已解析的数据字典中?也许这会奏效?将 API JSON 列表转储到 dict 中然后解析?那是我的 OP 想法的一部分。将拉取的 API JSON 列表转成字典,然后解析字典。
  • 这真的很接近,经过多次谷歌搜索后我找到了一个教程,并且在 2 小时内第一次将所有符号打印在一个列表中
【解决方案2】:

遍历data列表中的字典列表,通过key获取字典值:

print([['symbol:', d.get('symbol'), 'last:', d.get('last')] for d in data])

或使用key 进行索引:

print([['symbol:', d['symbol'], 'last:', d['last']] for d in data])

两者都产生相同的结果:

[['symbol:', 'BCNBTC', 'last:', '0.00000019437'], ['symbol:', 'BTCUSD', 'last:', '3886.76'], ['symbol:', 'DASHBTC', 'last:', '0.023404'], ['symbol:', 'DOGEBTC', 'last:', '0.00000051456'], ['symbol:', 'DOGEUSD', 'last:', '0.00199604'], ['symbol:', 'EMCBTC', 'last:', '0.000073615'], ['symbol:', 'ETHBTC', 'last:', '0.034325'], ['symbol:', 'FCNBTC', 'last:', '0.000011621']]

按照python getting a list of value from list of dict 中的建议,如果缺少value,请添加一个“替代”值来填充它:

print([['symbol:', d.get('symbol', None), 'last:', d.get('last', None)] for d in data if ('symbol' in d and 'last' in d)])

【讨论】:

  • 我猜您使用了列表 sn-p 并将其放入列表中,而我在运行代码时使用您的任何选项从 API 中提取数据:raise TypeError(f 'JSON 对象必须是 str、bytes 或 bytearray,' 类型错误:JSON 对象必须是 str、bytes 或 bytearray,而不是 Response
  • 是的,很抱歉造成混乱,我无法重现您的 API 响应
  • 我找到了 3 种方法来更改类,如果有帮助的话,我得到了 byte、str 和 list,也许一个比其他的更容易,我更新了我的 OP
  • 老实说,制作这个 API 的交易所并不容易使用,另一个站点连接到他们的 API 并使其成为一个字典,但他们没有给出所有硬币的链接,你必须添加地址末尾的硬币对
【解决方案3】:

经过数小时的尝试、修补和谷歌搜索后,我发现有人遇到相同的问题、不同的代码、相似的 API JSON 列表格式,并且一旦将他们的部分代码改编为我的,我只得到了要从列表中打印的符号,并且只有符号所以从这里我可以做一些小的调整来打印符号,最后再加一点缩进让它漂亮。他们做了一些非常接近我的代码的事情,但首先将他们的 API 转储到一个文件中,所以请让我知道这是否是比下面更好的方法:

def pull():
    r = requests.get('API_ADDRESS')
    data = r.json()
    # use to confirm class type
    #print(type(data))
    # use to see if keys are present
    #print(data.keys())
    items = []
    for item in data:
        items.append(item['symbol'])
    print(items)

【讨论】:

    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2017-04-26
    • 2017-08-20
    • 2017-06-10
    • 2016-10-12
    相关资源
    最近更新 更多