Python不会正确地使用for循环从字典中提取值

2021-01-26 09:27:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使用字典来检查特定SQL备份成功或失败的给定数量的服务器。到目前为止,我的问题是运行以下代码时:

for serverChk in srvrDict['Server']:

它在每一新行中以单个字符的形式返回服务器名称,例如:
S
E
R
V
E
R
所以在我的试用版中,我看到了“连接到T以检查操作系统版本的错误”,其中T是服务器名的第一个字符。我似乎不能把我的手指放在它上面,我所做的所有搜索都导致我问。 谢谢!在

^{2}$
3条回答
网友
1楼 ·

您正在重写srvrDict中的srvrDict中的srvrDict值,而不是实际生成一个数据序列,其中包含日志文件中每个项的条目。您需要将其列为包含字典的列表,并将其附加到每个迭代中。你可能在寻找更像这样的东西:

chkbkpstats = csv.reader(file('c://temp//networkerservers.csv'))
srvrs = []
for for row in chkbkpstats:
    srvrs.append({'Name' : row[0], 'Instance' : row[1]})
for srvr in srvrs:
    try:
        c = wmi.WMI(srvr['Instance'])
    except:                 
        print 'Error connecting to %s to check OS version' % srvr['Name']
    else:
        osVer = c.Win32_OperatingSystem()[0].Caption
        if '2003' in osVer:
            print 'w2k3'
        elif '2008' in osVer:
            print 'w2k8'
网友
2楼 ·

我想你在字典里存储了一个字符串。所以for serverChk in srvrDict['Server']行翻译成for serverChk in yourSavedString。这就是为什么你得到了个人角色。要访问单个字典项,您应该执行for k,v in srvrDict.iteritems(),其中k是键,v是值。在

网友
3楼 ·

你的代码有一些问题。在

首先,每次执行第一个for循环时,创建一个新的srvrDict,覆盖上次存储在此变量中的值。我想,你真正想做的是:

srvrDict = {}
for row in chkbkpstats:
    srvrDict[row[0]] = row[1]

现在,srvrDict将为chkbkpstats中的每一行包含一个类似{'P1RT04': ['THP06ASU']}的条目,将服务器名称映射到该服务器上运行的实例列表。在

然后,在第二个循环中,使用for serverChk in srvrDict:遍历字典中的所有条目。但是,我不确定c = wmi.WMI(server)中的变量server来自何处。如果这是第一个循环中的row[1],那么应该使用srcvDict[serverChk]从字典中检索值。在

这样,整个过程将如下所示:

^{pr2}$

注:我不确定c.Win32_OperatingSystem()的返回值是什么。[…]更新:感谢sr2222指出这一点。代码已修复。在

更新:编辑代码以允许一个服务器托管多个实例。在

相关问题