【发布时间】:2019-06-06 18:52:26
【问题描述】:
我的代码从昨天开始工作,但今天我运行了脚本并开始收到这个错误,说我不能再使用字符串来访问我的 JSON 字典了。据我了解,我已经在遍历我的字典条目并且它是有效的 JSON,因此我应该能够像字典一样访问其中的信息,其中包含字符串值,而不仅仅是列号:
S:\Scripts\ZACH\DB MERGE>python jsonMerge.py
Beginning Merge...
Traceback (most recent call last):
File "jsonMerge.py", line 42, in <module>
if intResult['SCH_NAME'] == extResult['SCH_NAME'] and intResult['SCH_CITY']
== extResult['SCH_CITY'] :
TypeError: list indices must be integers or slices, not str
我正在合并 2 个经过验证的 JSON 文件,如下所示:
[{"SCH_ID": "13554", "SCH_NAME": "100 Mile House Elementary", "SCH_ADDR": "Box 460, 145 North Birch", "SCH_CITY": "100 Mile House", "SCH_PROV": "BC", "SCH_PCODE": "V0K 2E0", "SCH_PHONE": "(250)395-2258", "SCH_FAX": "(250)395-3621", "SCH_DIST": "1027", "SCH_TYPE": "E", "SCH_P_REP": "FB", "SCH_G_REP": "", "SCH_P_COM": "LOC", "SCH_G_COM": "", "SCH_REBT": "10", "SCH_REBT2": "0", "SCH_P_CID": "23", "SCH_G_CID": "0", "SCH_P_CCD": "SR", "SCH_G_CCD": "", "DATE1": "", "DATE2": "", "PLAN1": "20G", "PLAN2": "2GR", "LNOPST": "FALSE"},{"SCH_ID": "16101", "SCH_NAME": "1 Step Ahead Preschool", "SCH_ADDR": "1340 Kingfisher Ave.", "SCH_CITY": "Kitimat", "SCH_PROV": "BC", "SCH_PCODE": "V8C 1G6", "SCH_PHONE": "(250)632-2288", "SCH_FAX": "", "SCH_DIST": "", "SCH_TYPE": "E", "SCH_P_REP": "FB", "SCH_G_REP": "", "SCH_P_COM": "P", "SCH_G_COM": "", "SCH_REBT": "0", "SCH_REBT2": "0", "SCH_P_CID": "23", "SCH_G_CID": "0", "SCH_P_CCD": "SR", "SCH_G_CCD": "", "DATE1": "", "DATE2": "", "PLAN1": "200", "PLAN2": "0", "LNOPST": "FALSE"},{"SCH_ID": "16736", "SCH_NAME": "1st Step Montessori", "SCH_ADDR": "8884 Russell Drive", "SCH_CITY": "Delta", "SCH_PROV": "BC", "SCH_PCODE": "V4C 4P8", "SCH_PHONE": "(604)417-3290", "SCH_FAX": "", "SCH_DIST": "1037", "SCH_TYPE": "E", "SCH_P_REP": "GF", "SCH_G_REP": "", "SCH_P_COM": "MWS", "SCH_G_COM": "", "SCH_REBT": "10", "SCH_REBT2": "0", "SCH_P_CID": "18", "SCH_G_CID": "0", "SCH_P_CCD": "SB", "SCH_G_CCD": "", "DATE1": "", "DATE2": "", "PLAN1": "20G", "PLAN2": "0", "LNOPST": "FALSE"},{"SCH_ID": "1959", "SCH_NAME": "150 Mile Elementary", "SCH_ADDR": "Box 259, 3081 Hwy. 97", "SCH_CITY": "150 Mile House", "SCH_PROV": "BC", "SCH_PCODE": "V0K 2G0", "SCH_PHONE": "(250)296-3356", "SCH_FAX": "(250)296-3291", "SCH_DIST": "1027", "SCH_TYPE": "E", "SCH_P_REP": "FB", "SCH_G_REP": "", "SCH_P_COM": "MWS", "SCH_G_COM": "", "SCH_REBT": "10", "SCH_REBT2": "0", "SCH_P_CID": "23", "SCH_G_CID": "0", "SCH_P_CCD": "SR", "SCH_G_CCD": "", "DATE1": "9/12/2018", "DATE2": "10/30/2018", "PLAN1": "2GS", "PLAN2": "2GR", "LNOPST": "FALSE"}]
和:
[{"District Number": "82", "School Code": "8297024", "SCH_NAME": "Na Aksa Gyilak'yoo", "SCH_ADDR": "PO Box 544 STN Main", "SCH_CITY": "Terrace", "SCH_PROV": "BC", "SCH_PCODE": "V8G 4B5", "Principal Title": "Mrs", "Principal First name": "Colleen", "Principal Last Name": "Austin", "School Type": "Standard School", "Grade Range": "K-12", "School Category": "Independent School", "Funding Group(s)": "2", "NLC: Early Learning": "no", "NLC: Afterschool": "no", "NLC: Cont. Ed.": "no", "NLC: Seniors": "no", "NLC: Comm. Sport": "no", "NLC: Comm. Use": "no", "NLC: Integr. Svcs.": "no", "SCH_PHONE": "(250)615-2844", "SCH_FAX": "(250)615-2833", "Email": "kalumteacher@gmail.com", "Enrolment Total": "80", "Enrolment As Of": "September 30 2018", "KH Enrolment": "1", "KF Enrolment": "11", "HS Registration": "0", "SU Enrolment": "0", "EU Enrolment": "0", "Grade 1 Enrolment": "2", "Grade 2 Enrolment": "8", "Grade 3 Enrolment": "4", "Grade 4 Enrolment": "5", "Grade 5 Enrolment": "4", "Grade 6 Enrolment": "8", "Grade 7 Enrolment": "4", "Grade 8 Enrolment": "9", "Grade 9 Enrolment": "5", "Grade 10 Enrolment": "11", "Grade 11 Enrolment": "3", "Grade 12 Enrolment": "5"}]
使用 SCH_NAME 和 SCH_CITY 作为主键:
with open(extFile, 'r') as extF:
#Iterate through every entry
for extLine in extF:
hasMatched = False
#load line
extResult = json.loads(extLine)
#print ("Checking: " + intResult['SCH_NAME'] + '\n')
#Set context as the external result to start us off
#contextLine = extResult
with open(intFile, 'r') as intF:
#Iterate through every entry
for intLine in intF:
#Load line
intResult = json.loads(intLine)
#print ("Matching: " + extResult['SCH_NAME'] + '\n')
#Check if rows match
if intResult['SCH_NAME'] == extResult['SCH_NAME'] and intResult['SCH_CITY'] == extResult['SCH_CITY'] :
#We have a match
hasMatched = True
谁能帮助阐明这里可能出了什么问题?
【问题讨论】:
-
只看错误,它认为
intResult和/或extResult是一个列表,您可能希望它们成为字典 -
为什么要将字典保存在列表中?只需“删除 []”或在键索引前添加 [0]。
-
如果没有“[]”封装所有条目,json.loads 将无法使用数据。在键之前添加“[0]”只允许我访问第一个条目,而不是我正在处理的所有 5000。我什至尝试嵌套另一个 for 循环以遍历 [0] 到 [5000],但它没有返回任何内容。
标签: python json dictionary merge primary-key