钥匙存在于字典中时,出现钥匙错误

问题描述 投票:0回答:1

我正在研究一个代码,它可以检测一条微博的语言,并应用与该语言相匹配的词法。这段代码以前工作得很好,它完成了它的工作。然后它抛出了一个 KeyError: '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")

出现错误的时候,会出现以下一行 dic[lang][path] = diagnostic 就像我说的那样,之前工作得很好,突然间就停止工作了,尽管我没有对代码做任何修改。

python dictionary keyerror
1个回答
2
投票

问题是,如果你遇到一个未知的语言,那么你就会执行 dic[lang] = {} 然后你马上 lang = "en". 现在如果 lang 例如,是 "es" 你的结局是 dic == {"es": {}}lang == "en". 在后面的代码中,你会做 dic[lang][path] = diagnostic 但此时 "en" not in dic 因为它仍然使用未知的语言代码("es"). 你可能想调换一下这两条语句的顺序,即第一条设置为 lang = "en" 进而 dic[lang] = {}.

© www.soinside.com 2019 - 2024. All rights reserved.