Python 字典中存在密钥时出现密钥错误

Python 字典中存在密钥时出现密钥错误,python,dictionary,keyerror,Python,Dictionary,Keyerror,我正在编写一个代码,用于检测tweet的语言,并应用与该语言匹配的词汇。代码过去工作得很好,它完成了它的工作。然后它抛出了一个键错误:“en”,即使字典中存在“en”。我已经看过多个已经有答案的问题,但这些问题似乎都不起作用。我将提供代码中只处理德语的部分(因此不包括其他语言)。代码被写入其中,如果检测到的语言不在词典中,它将自动分类为英语 from langdetect import detect import glob import re rsc_lg = { "de" : {

我正在编写一个代码,用于检测tweet的语言,并应用与该语言匹配的词汇。代码过去工作得很好,它完成了它的工作。然后它抛出了一个
键错误:“en”
,即使字典中存在“en”。我已经看过多个已经有答案的问题,但这些问题似乎都不起作用。我将提供代码中只处理德语的部分(因此不包括其他语言)。代码被写入其中,如果检测到的语言不在词典中,它将自动分类为英语

from langdetect import detect
import glob
import re

rsc_lg = {
      "de" : {"pos" : "ressources/positive_words_de.txt",
              "neg" : "ressources/negative_words_de.txt"},
      "en" : {"pos" : "ressources/positive_words_en.txt",
              "neg" : "ressources/negative_words_en.txt"}
      }
dic = {}
liste_resultats = []
for path in glob.glob("corpus/*/*/*"):
  f = open(path, errors="ignore")
  read = f.read().lower()
  lang = detect(read)
  if lang not in dic:
    dic[lang] = {} 

  if lang not in rsc_lg :
    lang = "en"

###german###
  f_de_pos = open(rsc_lg[lang]["pos"])
  f_de_neg = open(rsc_lg[lang]["neg"])
  de_pos = f_de_pos.read().lower().split()
  de_neg = f_de_neg.read().lower().split()
  f_de_pos.close()
  f_de_neg.close()

  words = read.split()
  pos_words_de = set(words) & set(de_pos)
  neg_words_de = set(words) & set(de_neg)

  if len(pos_words_de) > len(neg_words_de):
      diagnostic = "positive"
  if len(pos_words_de) == len(neg_words_de):
      diagnostic = "mixed"
  if len(pos_words_de) < len(neg_words_de):
      diagnostic = "negative"
#  print("this german tweet is ", diagnostic)
  dic[lang][path] = diagnostic


  corpus, lang, classe, nom = re.split("\\\\", path)
  liste_resultats.append([nom, lang, classe, diagnostic])

import json
w = open("resultats_langdetect_german.json", "w")
w.write(json.dumps(liste_resultats, indent= 2))
w.close()

f.close()

print("done")
从langdetect导入检测
导入glob
进口稀土
rsc_lg={
“de”:{“pos”:“resources/positive_words_de.txt”,
“neg”:“resources/negative_words_de.txt”},
“en”:{“pos”:“resources/positive_words_en.txt”,
“neg”:“resources/negative_words_en.txt”}
}
dic={}
liste_resultats=[]
对于glob.glob(“corpus/*/*/*”)中的路径:
f=打开(路径,错误=“忽略”)
read=f.read().lower()
lang=检测(读取)
如果lang不在dic中:
dic[lang]={}
如果lang不在rsc_lg中:
lang=“en”
###德文###
f_de_pos=打开(rsc_lg[lang][“pos”])
f_de_neg=开放(rsc_lg[lang][“neg”])
de_pos=f_de_pos.read().lower().split()
de_neg=f_de_neg.read().lower().split()
f_de_位置关闭()
f_de_neg.close()关闭
words=read.split()
pos\u words\u de=set(words)和set(de\u pos)
负单词=集合(单词)和集合(负单词)
如果len(pos_words_de)>len(neg_words_de):
诊断=“阳性”
如果len(pos_words_de)=len(neg_words_de):
诊断=“混合”
如果len(pos_words_de)
在将tweet分类为肯定、混合或否定之后,出现了一行
dic[lang][path]=diagnostic

正如我所说,这在之前工作得很好,尽管我对代码完全没有做任何更改,但突然停止了工作

问题是,如果遇到未知语言,则执行
dic[lang]={}
,然后立即执行
lang=“en”
。现在,如果
lang
是例如
的“es”
,那么您将得到
dic=={es:{}}
lang==“en”
。稍后在代码中,您将执行dic[lang][path]=diagnostic
,但此时
“en”不在dic中,因为它仍然使用未知的语言代码(
“es”
)。您可能需要切换这两条语句的顺序,即首先设置
lang=“en”
,然后执行
dic[lang]={}
问题是,如果遇到未知语言,则执行
dic[lang]={}
,然后立即执行
lang=“en”
。现在,如果
lang
是例如
的“es”
,那么您将得到
dic=={es:{}}
lang==“en”
。稍后在代码中,您将执行dic[lang][path]=diagnostic
,但此时
“en”不在dic中,因为它仍然使用未知的语言代码(
“es”
)。您可能希望切换两条语句的顺序,即首先设置
lang=“en”
,然后执行
dic[lang]={}

是否调试了此代码?错误发生在哪一行?你让我们猜测错误在哪里。请更新问题以包含完整的错误回溯消息。哦,对不起!我已经添加了错误发生的位置。您是否调试了此代码?错误发生在哪一行?你让我们猜测错误在哪里。请更新问题以包含完整的错误回溯消息。哦,对不起!我已经添加了错误发生的位置谢谢,我甚至没有想到这一点。奇怪的是,它之前工作得很好,突然意识到有一个错误@阿里格。这可能是因为您在一些新数据上运行了代码,而这些数据被检测为一种语言,而您的资源中没有包含这种语言。这就是为什么它可以在不改变代码本身的情况下改变行为,它依赖于输入数据。谢谢,我甚至没有想到这一点。奇怪的是,它之前工作得很好,突然意识到有一个错误@阿里格。这可能是因为您在一些新数据上运行了代码,而这些数据被检测为一种语言,而您的资源中没有包含这种语言。这就是它如何在不改变代码本身的情况下改变行为,它依赖于输入数据。