【问题标题】:Getting a KeyError when rotating through a for loop to create a dict通过 for 循环旋转以创建 dict 时获取 KeyError
【发布时间】:2020-10-11 23:22:39
【问题描述】:

我正在从 coinbase pro 的产品代码中导入贸易数据。我设置了 for 循环以将特定信息导入特定属性。 for 循环迭代(似乎是)随机次数并吐出一个关键错误。我确定数据集包含它所采购的字典中的属性。我知道这一点,因为它以随机顺序吐出数据,因此它调用的特定属性之前已成功调用过。 (此外,我将这些值分别称为暂停以仔细检查它们是否为空)我还将 for 循环范围减小到大小的三分之一。它似乎仍然有 KeyError(尽管偶尔它确实解析并打印了所有数据。 更新我没有文件中的数据集,因为我从 coinbase pro 调用它,但如果您愿意,我可以添加它提取的数据的文本文件吗?

import cbpro,
public_client = cbpro.PublicClient()
aprods=public_client.get_products()
prods=[temp['id'] for temp in aprods]

for i in range(0,len(prods)):
    print(i,prods[i])
    tprods={
            'id': prods[i],
            'price': float(public_client.get_product_ticker(product_id=prods[i]) ['price']),
            'h24': float(public_client.get_product_24hr_stats(prods[i]) ['high']),
            'l24': float(public_client.get_product_24hr_stats(prods[i]) ['low']),
            'range':(float(public_client.get_product_24hr_stats(prods[i]) ['high'])-float(public_client.get_product_24hr_stats(prods[i]) ['low'])),
            '%range':100*(float(public_client.get_product_24hr_stats(prods[i]) ['high'])-float(public_client.get_product_24hr_stats(prods[i]) ['low']))/float(public_client.get_product_ticker(product_id=prods[i])['price'])
            }

以下是回溯

Traceback (most recent call last):
  File "C:\Users\Slide 2.0\Desktop\cryptopj\apt.py", line 24, in <module>
    'h24': float(public_client.get_product_24hr_stats(prods[i]) ['high']),
KeyError: 'high'

【问题讨论】:

  • 当您handled the error 并检查/打印了东西时,它是否给了您线索?您认为这是您的代码或数据的问题吗?您的minimal reproducible example 应始终包含示例数据,足以重现问题。
  • 发布有关产生异常的代码的问题时,请始终包含完整的 Traceback - 复制并粘贴它,然后将其格式化为代码(选择它并输入 ctrl-k
  • 感谢您的提示!我已经更新以相应地发布。我认为这是代码,因为当我从 coinbase pro 提取数据时,它不会每次都在同一个位置抛出错误。它可能是一次发送到 CBpro 的多个查询吗? @二战
  • 在询问依赖数据的代码时,重要的是在您的问题中包含数据的最小示例。有时您可能想为问题创建假数据 - 只要它忠实地代表实际数据。您越容易让 us 从您的问题中复制和粘贴(以便我们可以执行您的代码并测试我们的解决方案),您获得响应的可能性就越大。将数据复制并粘贴为文本,然后将其格式化为代码。 - 请阅读minimal reproducible example

标签: python dictionary keyerror coinbase-api


【解决方案1】:

首先,您应该使用调试器(如果您的 IDE 有)或准备一些机制来为您提供有关导致错误的行的更多详细信息。

对于后者,最简单的方法是在访问字典键之前打印该行

print(public_client.get_product_24hr_stats(prods[i]))

此外,您似乎每次都在查询一些 API 以获取新数据,因此您每次都不是在处理相同的构造。您可能希望分配一个变量并稍后访问它的键。您提出的解决方案可能会达到某种速率限制并返回一些带有错误消息的奇怪字典,而不是实际数据。

prods_data= public_client.get_product_24hr_stats(prods[i])
tprods={
            'id': prods[i],
            'price': float(public_client.get_product_ticker(product_id=prods[i]) ['price']),
            'h24': float(prods_data.get('high', 0)),
            'l24': float(prods_data.get('low', 0)),

等等。另外请注意,您可以使用字典的“get”方法,使用默认值(在本例中为 0)以更好地处理错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2014-12-21
    • 2014-11-27
    • 2010-10-29
    • 2013-09-04
    • 2022-01-03
    相关资源
    最近更新 更多