【问题标题】:JSON sub for loop produces KeyError, but key existsJSON sub for 循环产生 KeyError,但 key 存在
【发布时间】:2017-02-17 07:39:09
【问题描述】:

我正在尝试将下面的 JSON 输出添加到字典中,以保存到 SQL 数据库中。

{'Parkirisca': [
    {    
    'ID_Parkirisca': 2,
    'zasedenost': {
                   'Cas': '2016-10-08 13:17:00',
                   'Cas_timestamp': 1475925420,
                   'ID_ParkiriscaNC': 9,
                   'P_kratkotrajniki': 350
                  }
    }
]}

我目前正在使用以下代码将值添加到字典中:

import scraperwiki
import json
import requests
import datetime
import time
from pprint import pprint

html = requests.get("http://opendata.si/promet/parkirisca/lpt/")

data = json.loads(html.text)

for carpark in data['Parkirisca']:

    zas = carpark['zasedenost']
    free_spaces = zas.get('P_kratkotrajniki')
    last_updated = zas.get('Cas_timestamp')

    parking_type = carpark.get('ID_Parkirisca')
    if parking_type == "Avtomatizirano":
        is_automatic = "Yes"
    else:
        is_automatic = "No"

    scraped = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')

    savetodb = {
    'scraped': scraped,
    'id': carpark.get("ID_Parkirisca"),
    'total_spaces': carpark.get("St_mest"),
    'free_spaces': free_spaces,
    'last_updated': last_updated,
    'is_automatic': is_automatic,
    'lon': carpark.get("KoordinataX_wgs"), 
    'lat': carpark.get("KoordinataY_wgs")
    }

    unique_keys = ['id']

    pprint savetodb

但是当我运行它时,它卡在for zas in carpark["zasedenost"] 并输出以下错误:

Traceback (most recent call last):
File "./code/scraper", line 17, in <module>
    for zas in carpark["zasedenost"]:
KeyError: 'zasedenost'

我一直相信zas 现在实际上是一个字符串,而不是字典,但我是 Python 和 JSON 的新手,所以不知道要搜索什么来获得解决方案。我还在 Stack Overflow 上搜索了 KeyErrror when key exist 问题,但它们没有帮助,我相信这可能是因为这是一个子 for 循环。

更新:现在,当我将双引号换成单引号时,出现以下错误:

Traceback (most recent call last):
File "./code/scraper", line 17, in <module>
    free_spaces = zas.get('P_kratkotrajniki')
AttributeError: 'unicode' object has no attribute 'get'

【问题讨论】:

  • for 循环上方放置一个print(carpark),这样您就可以看到该变量中的内容。
  • 顺便说一句,您共享的“JSON”不是有效的 JSON。 (它使用单引号。)
  • print(repr(carpark)) 可能会更好。这将帮助您发现它是否确实是预期的dict
  • 我也不认为你的意思是迭代carpark["zasedenost"](因为它是一本字典)。你可能只想要zas = carpark["zasedenost"]
  • 请提供一个最小、完整和可验证的示例。 stackoverflow.com/help/mcve

标签: python json list for-loop dictionary


【解决方案1】:

我修改了你的代码:

  1. 添加了必需的导入。
  2. 修复了无效 Python 的 pprint savetodb 行。
  3. 没有尝试迭代 carpark['zasedenost']

然后,我在for 循环中添加了另一个pprint 语句,以查看KeyError 发生时carpark 中的内容。从那里,错误很明显。 (并非 JSON 中数组中的所有元素都包含 'zasedenost' 键。)

这是我使用的代码:

import datetime
import json
from pprint import pprint
import time

import requests

html = requests.get("http://opendata.si/promet/parkirisca/lpt/")

data = json.loads(html.text)

for carpark in data['Parkirisca']:
    pprint(carpark)
    zas = carpark['zasedenost']
    free_spaces = zas.get('P_kratkotrajniki')
    last_updated = zas.get('Cas_timestamp')

    parking_type = carpark.get('ID_Parkirisca')
    if parking_type == "Avtomatizirano":
        is_automatic = "Yes"
    else:
        is_automatic = "No"

    scraped = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')

    savetodb = {
        'scraped': scraped,
        'id': carpark.get("ID_Parkirisca"),
        'total_spaces': carpark.get("St_mest"),
        'free_spaces': free_spaces,
        'last_updated': last_updated,
        'is_automatic': is_automatic,
        'lon': carpark.get("KoordinataX_wgs"), 
        'lat': carpark.get("KoordinataY_wgs")
    }

    unique_keys = ['id']

    pprint(savetodb)

下面是出现KeyError 的迭代输出:

{u'A_St_Mest': None,
 u'Cena_dan_Eur': None,
 u'Cena_mesecna_Eur': None,
 u'Cena_splosno': None,
 u'Cena_ura_Eur': None,
 u'ID_Parkirisca': 7,
 u'ID_ParkiriscaNC': 72,
 u'Ime': u'P+R Studenec',
 u'Invalidi_St_mest': 9,
 u'KoordinataX': 466947,
 u'KoordinataX_wgs': 14.567929171694901,
 u'KoordinataY': 101247,
 u'KoordinataY_wgs': 46.05457609543313,
 u'Opis': u'2,40 \u20ac /dan',
 u'St_mest': 187,
 u'Tip_parkirisca': None,
 u'U_delovnik': u'24 ur (ponedeljek - petek)',
 u'U_sobota': None,
 u'U_splosno': None,
 u'Upravljalec': u'JP LPT d.o.o.'}
Traceback (most recent call last):
  File "test.py", line 14, in <module>
    zas = carpark['zasedenost']
KeyError: 'zasedenost'

如您所见,错误非常准确。字典中没有键 'zasedenost'。如果您查看 JSON,您会发现该数组中的许多元素都是如此。

我建议修复,但我不知道在没有此字典键的情况下您想要做什么。也许你想要这样的东西:

zas = carpark.get('zasedenost')
if zas is not None:
    free_spaces = zas.get('P_kratkotrajniki')
    last_updated = zas.get('Cas_timestamp')
else:
    free_spaces = None
    last_updated = None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多