python - KeyError:python中的'valor'
问题描述
尝试从我从网站自动生成的各种 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']))
解决方案
也许json_date不在dados中,让我们试试
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
推荐阅读
- excel - Excel VBA清除列范围内的间接下拉单元格
- c# - 在 C# 中使用 Activex 控件
- nservicebus - 使用具有可恢复性的 Sagas
- java - 针对 XSD 的 SOAP 响应获取 org.xml.sax.SAXParseException
- firebase - 在 App Engine 标准 Golang 中初始化 Firebase 管理员
- audiokit - 检查 midi 输入或目的地是否打开
- java - Java JNA WinAPI函数静默崩溃JVM
- python - Python Pandas返回具有多个条件的行-TypeError:&:'str'和'str'不支持的操作数类型
- go - go 模块如何使用可安装的命令?
- vba - VB宏在''我的公式周围插入,请协助