我想在Python中访问特定的键值(“ cote_1989_base”)以对其进行修改。但是我有一个TypeError:字符串索引必须是整数。
我的代码:
import json
with open('demo_db_algolia_2019.json', encoding='utf-8') as data_file:
data = json.loads(data_file.read())
for x in data:
cote1989base = x.get(["cote"][0]["cote_1989"]["cote_1989_eu"]["cote_1989_base"])
print(cote1989base)
编辑:也许我没有很好地解释这一点,因为我的整个JSON都在这样的数组中:
[{
"objectID": 10035,
"cote":
{
"cote_1989":
{
"cote_1989_f": "750000F",
"cote_1989_eu":
{
"cote_1989_base": 190140
}
},
"cote_2004":
{
"cote_2004_base": 173320
},
"cote_2014":
{
"cote_2014_base": 420800
},
"cote_2017":
{
"cote_2017_base": 939600
},
"cote_2019":
{
"cote_2019_base": 939600
}
}
},
{
"objectID": 10202,
"cote":
{
"cote_1989":
{
"cote_1989_f": "27000F",
"cote_1989_eu":
{
"cote_1989_base": 6844
}
},
"cote_2004":
{
"cote_2004_base": 10894
},
"cote_2014":
{
"cote_2014_base": 23670
},
"cote_2017":
{
"cote_2017_base": 46980
},
"cote_2019":
{
"cote_2019_base": 51156
}
}
}
]
它是否改变了主要问题?
答案 0 :(得分:2)
您应按以下方式访问密钥:
x.get("cote").get("cote_1989").get("cote_1989_eu").get("cote_1989_base")
或者您可以使用以下函数来简化代码:
def find(data, key):
parts = key.split('/')
dd = data
for part in parts:
if ( dd == None or not isinstance(dd,dict)):
return None
dd = dd.get(part)
return dd
>>> data = { 'a' : { 'b' : { 'c' : { 'd':5} , 'c1':8 } }}
>>> find(data, 'a/b/c/d'))
5
>>> find(data, 'a/b/c2')
8
>>> find(data, 'z/b')
None
答案 1 :(得分:0)
此位:x.get(["cote"][0]["cote_1989"]
当然是错误的。这里的方括号不是dict
查找,而是列表文字,因此["cote"][0]
的值为"cote"
。
然后,用["cote_1989"]
下标,TypeError
就是下标。
您应该链接.get()
个呼叫:
x.get("cote").get("cote_1989").get("cote_1989_eu").get("cote_1989_base")
假设原始JSON正确,那么在原始代码中将[0]
位视为“行噪声”。
答案 2 :(得分:0)
JSON
中存在错误。花括号不匹配。使用这个。
import json
j = '''
{
"objectID": 10035,
"cote": {
"cote_1989": {
"cote_1989_f": "750000F",
"cote_1989_eu": {
"cote_1989_excp": 266196,
"cote_1989_concours": 228168,
"cote_1989_base": 190140,
"cote_1989_be": 152112,
"cote_1989_me": 114084,
"cote_1989_ar": 76056,
"cote_1989_epa": 38028
}
},
"cote_2004": {
"cote_2004_excp": 242648,
"cote_2004_concours": 207984,
"cote_2004_base": 173320,
"cote_2004_be": 138656,
"cote_2004_me": 103992,
"cote_2004_ar": 69328,
"cote_2004_epa": 34664
}
}
}'''
data = json.loads(j)
print(data['cote']['cote_1989']['cote_1989_eu']['cote_1989_base'])
输出:
190140