Python-使用“时出现键错误”;如果在dict中;
在运行脚本解析XML文件内容时,我收到以下错误Python-使用“时出现键错误”;如果在dict中;,python,xml,dictionary,key,iteration,Python,Xml,Dictionary,Key,Iteration,在运行脚本解析XML文件内容时,我收到以下错误 if iteration.findtext("Iteration_query-def") in ecdict: KeyError: 'XLOC_000434' 我的印象是,使用“if in dict”意味着如果在字典中找不到键,脚本将继续执行if语句,并继续执行其余代码。下面是我正在使用的代码中有问题的部分。我意识到这是一个非常基本的问题,但我不确定我还能说些什么,我不明白为什么我会收到这个错误 import xml.etree.ElementT
if iteration.findtext("Iteration_query-def") in ecdict:
KeyError: 'XLOC_000434'
我的印象是,使用“if in dict”意味着如果在字典中找不到键,脚本将继续执行if语句,并继续执行其余代码。下面是我正在使用的代码中有问题的部分。我意识到这是一个非常基本的问题,但我不确定我还能说些什么,我不明白为什么我会收到这个错误
import xml.etree.ElementTree as ET
tree = ET.parse('507.FINAL_14.2.14_2_nr.out_fmt5.out')
blast_iteration = tree.find("BlastOutput_iterations")
for iteration in blast_iteration.findall("Iteration"):
query = iteration.findtext("Iteration_query-def").strip().strip("\n")
if query in score:
continue
if iteration.findtext("Iteration_message") == "No hits found":
if iteration.findtext("Iteration_query-def") in tair:
tairid = tair[iteration.findtext("Iteration_query-def")][0]
tairdes = tair[iteration.findtext("Iteration_query-def")][1]
else:
tairid = "-"
tairdes = "-"
goterms = ""
ecterms = ""
if iteration.findtext("Iteration_query-def") in godict:
for x in godict[iteration.findtext("Iteration_query-def")][:-1]:
goterms = goterms + x + ";"
goterms = goterms + godict[iteration.findtext("Iteration_query-def")][-1]
else:
goterms = "-"
if iteration.findtext("Iteration_query-def") in ecdict:
for x in ecdict[iteration.findtext("Iteration_query-def")][:-1]:
ecterms = ecterms + x + ";"
ecterms = ecterms + ecdict[iteration.findtext("Iteration_query-def")][-1]
else:
ecterms = "-"
if iteration.findtext("Iteration_query-def") in godescr:
desc = godescr[iteration.findtext("Iteration_query-def")]
else:
desc = "-"
n += 1
p = "PvOAK_up"+str(n) + "\t" + tranlen[iteration.findtext("Iteration_query-def")] + "\t" + orflen[iteration.findtext("Iteration_query-def")] + "\t" + "-" + "\t" + "-" + "\t" + tairid + "\t" + tairdes + "\t" + goterms + "\t" + ecterms + "\t" + desc + "\t" + str(flower[query][2]) + "\t" + str('{0:.2e}'.format(float(flower[query][1]))) + "\t" + str('{0:.2f}'.format(float(flower[query][0]))) + "\t" + str('{0:.2f}'.format(float(leaf[query][2]))) + "\t" + str('{0:.2f}'.format(float(leaf[query][1]))) + "\t" + str('{0:.2f}'.format(float(leaf[query][0])))
print p
希望你能帮忙
谢谢
编辑:我应该说,godict和ecdict以前是按如下方式创建的-如果需要,我可以提交整个代码:
godict = {}
ecdict = {}
godescr = {}
f = open("507.FINAL_14.2.14_2_nr.out_fmt5.out.annot")
for line in f:
line = line.split("\t")
if len(line) > 2:
godescr[line[0]] = line[2]
line[1] = line[1].strip("\n")
if line[1].startswith("EC"):
if line[0] in ecdict:
a = ecdict[line[0]]
a.append(line[1])
ecdict[line[0]] = a
else:
ecdict[line[0]] = [line[1]]
else:
if line[0] in godict:
a = godict[line[0]]
a.append(line[1])
godict[line[0]] = a
else:
godict[line[0]] = [line[1]]
回溯:
Traceback (most recent call last):
File "2d.test.py", line 170, in <module>
p = "PvOAK_up"+str(n) + "\t" + tranlen[iteration.findtext("Iteration_query-def")] + "\t" + orflen[iteration.findtext("Iteration_query-def")] + "\t" + "-" + "\t" + "-" + "\t" + tairid + "\t" + tairdes + "\t" + goterms + "\t" + ecterms + "\t" + desc + "\t" + str(flower[query][2]) + "\t" + str('{0:.2e}'.format(float(flower[query][1]))) + "\t" + str('{0:.2f}'.format(float(flower[query][0]))) + "\t" + str('{0:.2f}'.format(float(leaf[query][2]))) + "\t" + str('{0:.2f}'.format(float(leaf[query][1]))) + "\t" + str('{0:.2f}'.format(float(leaf[query][0])))
KeyError: 'XLOC_000434'
回溯(最近一次呼叫最后一次):
文件“2d.test.py”,第170行,在
p=“PvOAK\u up”+str(n)+“\t”+tranlen[iteration.findtext(“iteration\u query-def”)]+“\t”+“-”+“\t”+“\t”+“\t”+tairid+“\t”+tairdes+“\t”+goterms+“\t”+ecterms+“\t”+“+desc”\t”+str(flower[2])”+“+str格式:.str({0.2f}).格式(float(flower[query][0]))+“\t”+str({0.2f}).格式(float(leaf[query][2]))+“\t”+str({0.2f}).格式(float(leaf[query][1]))+“\t”+str格式(float(leaf[query][0]))
键错误:“XLOC_000434”
iteration.findtext(“iteration\u query-def”)
是否可以作为异常源?
中的永远不会抛出KeyError
;什么是完整的回溯?您确定用最新版本的代码重新启动Python吗?您是否尝试过使用ecdict.get(…等)而不是ecdict[…添加更多的代码是错误的方向--尝试用更少的代码重现问题会很有帮助。请看…回溯没有显示更多细节这一事实本身非常有帮助。它告诉我们问题不在findtext()调用内部,但更可能是findtext()的结果在tranlen中不存在。值得注意的是,这不是一个“if in dict”用法,使得这个问题的主题具有误导性。