好的,我正在尝试做的是每当工作中的服务器出现故障时,我会收到一封电子邮件,通知我它已经关闭,还有其他一些信息。我正在尝试做的是写一些东西来拉动服务器的关键性(经常变化)并根据其重要性采取特定的行动。所以我所做的就是获取包含所有信息的excel文档,并用它创建了一个字典。密钥都是服务器名称,值是它们的关键性。然后我尝试将电子邮件中的服务器名称与字典进行比较,以提取服务器的关键性。这里有一些印刷语句及其结果。
print server_name
print server_list
print server_name in [server_list]
我明白了:
ABC123
{'': '', u'ABC123': u'High':''}
False
我仍然是python的新手,但是当我检查server_name是否在server_list中时,我认为我得到了False,因为我正在尝试将字符串与unicode进行比较。所以我尝试将字符串转换为unicode,但它仍然无法工作(尝试通过使用类型(server_name)进行验证,以确保它们都是相同的类型)。
现在这是我的代码的更大部分:
email_subject = str(messages.GetLast())
period = email_subject.find('.')
period = int(period)
server_name = email_subject[0:period]
server_name = str(server_name.upper())
if server_name in [server_list]:
print 'server name is found in the server list'
elif server_name not in [server_list]:
print 'server name is not found in the server list'
criticality = server_list[server_name]
print server_name
print criticality
这给了我输出:
ABC123
High
因此,当我运行此部分时,因为我的'if'语句为False,所以它运行我的elif语句,即True。然后它会正确打印出服务器名称以及关键性。我不明白的是为什么我找不到字典中的密钥,但我可以拉出我找不到的密钥值?此外,如果我从
更改我的'if'语句if server_name in [server_list]
到
if server_name not in [server_list]
我可以让它按照我想要的方式运行,但是我真的很难理解我为什么会那样工作。
答案 0 :(得分:2)
这与unicode无关。
server_list
实际上是一本字典。 server_name in [server_list]
时,您将词典放入列表(即它变为[{'': '', u'ABC123': u'High':''}]
),然后查看server_name
是否在名单。它不是,因为它是一个字符串。您只需将测试更改为:if server_name in server_list
,而不包括周围的括号
此外,最好将其重命名为server_dict
。
只是为了说明:
my_dict = {'ABC': True}
'ABC' in [my_dict] # False
'ABC' in my_dict # True
答案 1 :(得分:1)
我认为你的问题在这里:
if server_name in [server_list]:
如果server_list有类型列表,您应该按如下方式使用它:
if server_name in server_list:
检查此示例:
>>> lst = ['this', 'is', 'example']
>>> 'is' in lst
True
>>> 'is' in [lst]
False
更新:另外,为了您自己的安全,请考虑将所有字符串值转换为小写,因为'是'和'是'是不同的字符串。