JSON sub-for循环生成KeyError,但key存在

2024-10-03 17:27:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我当前正在使用以下代码将值添加到词典:

^{pr2}$

但是,当我运行这个时,它在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还不熟悉,所以不知道要搜索什么来获得解决方案。我也在这里搜索了堆栈溢出问题KeyErrror when key exist问题,但它们没有帮助,我认为这可能是由于这是一个sub-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'

Tags: inidjsonmostfor字典错误cas
1条回答
网友
1楼 · 发布于 2024-10-03 17:27:47

我修正了你的密码:

  1. 添加了必需的导入。在
  2. 修复了pprint savetodb行,该行不是有效的Python。在
  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出现的迭代的输出:

^{pr2}$

如你所见,这个错误是相当准确的。字典中没有键'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

相关问题 更多 >