【问题标题】:KeyError: 'valor' in pythonKeyError:python中的'valor'
【发布时间】:2020-09-22 10:08:48
【问题描述】:

我在尝试从网站自动生成的各种 JSON 中访问名为“valor”的键值时遇到此错误。例如,在其周期中的月份代码的每次迭代中,我都会得到不同的 JSON。但是 JSON 的格式,即键名,应该与每个 JSON 相同。 我的代码是:

 year_codes = ["2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020"]

    month_codes = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]

    city_codes = ["1111609", "1120303", "11A1312", "11D1714", "11E0402", "16D0105", "16E0603", "16F1009", "16G1823",
                  "16H0502", "16J0907", "1701106", "1701512", "1840205", "1851416", "1861214", "1870705", "1500805"]

    valor_anual = [0]

    for city_code in city_codes:

        for year_code in year_codes:
            valor_mensal_aux = []
            for month_code in month_codes:

                url_imob = Request(
                    "https://www.ine.pt/ine/json_indicador/pindica.jsp?op=2&varcd=0010042&Dim1=S3A" + year_code + \
                    month_code + "&Dim2=" + city_code + "&Dim3=T&lang=PT", headers={'User-Agent': 'XYZ/3.0'})
                json_date = year_code + month_code
                response = urlopen(url_imob)
                data = json.loads(response.read())
                valor_mensal_aux.append(int(data[0]['Dados'][json_date][0]['valor']))

            city_name = data[0]['Dados'][json_date][0]['geodsg']
            dua = data[0]['DataUltimoAtualizacao']
            valor_anual = statistics.mean(valor_mensal_aux)

        python_imob = Imob(int(year_code), valor_anual, dua, city_name)
        session.add(python_imob)
        session.commit()
        session.close()
        imobs = session.query(Imob).all()

JSON 的样子是:

[ {
  "IndicadorCod" : "0010042",
  "IndicadorDsg" : "Valor mediano de avaliação bancária (€/ m²) por Localização geográfica (Município - 2013) e Tipo de construção; Mensal - INE, Inquérito à avaliação bancária na habitação",
  "MetaInfUrl" : "https://www.ine.pt/bddXplorer/htdocs/minfo.jsp?var_cd=0010042&lingua=PT",
  "DataExtracao" : "2020-06-29T15:55:51.640+01:00",
  "DataUltimoAtualizacao" : "2020-06-29",
  "UltimoPref" : "Maio de 2020",
  "Dados" : {
    "202005" : [ {
      "geocod" : "1701106",
      "geodsg" : "Lisboa",
      "dim_3" : "T",
      "dim_3_t" : "Total",
      "valor" : "3084"
    } ]
  }
} ]

KeyError: 'valor' 在这一行:

valor_mensal_aux.append(int(data[0]['Dados'][json_date][0]['valor']))

【问题讨论】:

  • 在某些情况下data = json.loads(response.read()) 可能不会返回valor

标签: python json


【解决方案1】:

可能dados中没有json_date,我们试试

valor_mensal_aux.append(int(data[0]['Dados'][json_date][0]['valor']))

成为

dados_value = data[0]['Dados'].get(json_date, {}) ## get dados_value first
if dados_value and hasattr(dados_value[0], 'valor'): ## if dados_value has valor then append
    valor_mensal_aux_value = dados_value and dados_value[0] and dados_value[0].get('valor') or None
    if valor_mensal_aux_value:
        valor_mensal_aux.append(int(valor_mensal_aux_value))
    else: continue
else:
    print(json_date, dados_value) # json_date with emply dados_value
    continue ## this will skip the record does not have dados_value 
          

更紧凑的版本

dados_value = data[0]['Dados'].get(json_date, {}) 
valor_mensal_aux_value = dados_value and dados_value[0] and dados_value[0].get('valor') or None
if valor_mensal_aux_value:
    valor_mensal_aux.append(int(valor_mensal_aux_value))
else:
    continue

【讨论】:

  • 哦,太好了!当我打印 json,date 和 dados_value 时,有一个日期在 2013 年第 4 个月,即 json_date=201304,dados 值是这样的:[{'geocod': '1111609', 'geodsg': 'Viana do Castelo ', 'dim_3': 'T', 'dim_3_t': 'Total', 'sinal_conv': '¿', 'sinal_conv_desc': 'Dado confidencial'}] 所以我没有价值'valor'。当 valor 不存在时,我该怎么做才能跳过迭代?
  • 您的代码有效,非常感谢!另外,为什么人们不赞成我的问题?这是一个诚实的问题,我不知道如何解决它..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2018-06-03
  • 2023-03-28
相关资源
最近更新 更多