【问题标题】:python KeyError:0python KeyError:0
【发布时间】:2016-04-02 00:45:10
【问题描述】:

我的来自 Twython 的程序流数据产生了这个错误:

longitude=data['coordinates'][0]
KeyError: 0

这发生在以下代码中:

class MyStreamer(TwythonStreamer):
    def on_success(self, data):
        if 'text' in data:
            if data['place']!=None:
                if 'coordinates' in data and data['coordinates'] is not None:
                    longitude=data['coordinates'][0]

然后我在经度语句之前插入了print(data['coordinates']) 行,最近一次间歇性地发生此错误,它打印出{'coordinates': [-73.971836, 40.798598], 'type': 'Point'}。虽然有时它会像这样颠倒关键条目的顺序: {'type': 'Point', 'coordinates': [-73.97189946, 40.79853829]}

然后我添加了print 调用type(data)type(data['coordinates']) 并在错误发生时得到dict 作为两者的结果。

我现在也意识到这只是在data['place']!=None 时发生(并且每次都发生)。 所以我现在正在对data['place']type(data['place'])repr(data['place']) 进行打印调用

我还能在这里输入什么来捕获错误/找出发生了什么?

如果有帮助,here 是包含 TwythonStreamer 类定义的 200 行 Python 文件。

【问题讨论】:

  • 您的问题到底是什么?您希望您的程序运行这些错误还是要调试它?对于这类问题,我建议使用 try 和 except 子句。
  • @UlfAslak:捕获异常并不能阻止它被抛出。
  • data是什么对象?它看起来像一本字典,但显然它有时不像一本。 (或者,我认为存储为 data['coordinates'] 的类似列表的对象可能不是一个真正的列表。)
  • 什么是type(data)type(data['coordinates']) 发生错误时?
  • @Rogaliski - 我只是把它们放进去,当错误再次触发时会报告。

标签: python twython keyerror


【解决方案1】:

现在您已经为问题添加了更真实的代码,问题出在哪里似乎很明显。 Twython 流媒体并不总是发送坐标数据,它可以是None - 但是当它发送它时,lat/long 值可能嵌套两层深.

所以数据结构是这样的:

{
    'coordinates': {
        'coordinates': [-73.971836, 40.798598],
        'type': 'Point'
    },
    ...
}

这意味着您的代码需要如下所示:

class MyStreamer(TwythonStreamer):
    def on_success(self, data):
        if 'text' in data:
            if 'place' in data and data['place'] is not None:
                if 'coordinates' in data and data['coordinates'] is not None:
                    longitude, latitude = data['coordinates']['coordinates']

或者更简单地说:

class MyStreamer(TwythonStreamer):
    def on_success(self, data):
        if 'text' in data:
            place = data.get('place')
            if place is not None:
                coords = data.get('coordinates')
                if coords is not None:
                    longitude, latitude = coords['coordinates']

【讨论】:

  • 您写的所有内容都是正确且有用的,但请注意错误很少见。如果我正确理解代码的其余时间按原样工作,那么数据源似乎不一致;大多数时候coordinates 位于字典的根部,但在极少数情况下它是嵌套的。 Jeff 必须在每次调用时检查结构并相应地进行分支(并希望这是数据中唯一的不一致)。
  • @Ekhumoro 实际上,它似乎比这更奇怪,因为我确实在我的代码的另一个分支中获得了经度/纬度值。似乎只有当有位置值时它才嵌套 2 层深。如果没有位置值,则为 1 级深。我将更改我的代码,如果长时间运行而没有错误(或者我在数据库中看到位置数据和经度数据,这意味着相同的事情),那么我会认为问题已解决,而不是 python 错误,而只是一个Twitter API 中的混乱。
  • @Ekhumoro 那么我可以通过写if mydict.get('mykey') is not None:来更紧凑地编写我的if测试(否和)
  • @JeffWinchell。这里根本没有什么奇怪或令人困惑的地方。您只是还没有完全了解 API 的工作原理。如果您一开始就在问题中包含了所有相关信息和代码,那么这将是一个很容易解决的问题。至于使用get():这取决于其余代码的结构。如果您需要多次访问placecoords,可能会导致代码的效率和可读性略高。
  • @Ekhumoror 首先,感谢您花时间提供帮助并找到解决方案。至于其他假设: 1. 我已经阅读了 Twython 和 Twitter 的所有 API 文档,但我仍然找不到它说使用位置时坐标是双倍深度的地方。我认为它是一个未记录的功能。 2. 很难知道什么是相关代码。 3. 我在第一篇文章中就有了 print(data['coordinates']) 及其结果,所以包括我在内的很多人都忽略了很明显我需要一个 data['coordinates']['coordinates']。只是表明我们都是不完美的人。 :-)
猜你喜欢
  • 2022-08-10
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多