繁体   English   中英

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

[英]Python will not pull values from dictionary properly using for loop

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

for serverChk in srvrDict['Server']:

它将服务器名称作为单个字符返回到每个新行,如:
小号
Ë
[R
V
Ë
[R
因此,在我的试用版中,我看到“连接到T以检查操作系统版本时出错”,其中T是服务器名称的第一个字符。 我似乎无法把手指放在上面,我所做的所有搜索都引出了我的要求。 谢谢!

class checkstatus:
#def getServers(self):
    chkbkpstats = csv.reader(file('c://temp//networkerservers.csv'))
    for row in chkbkpstats:
        srvrDict = {}
        srvrDict['Server'] = row[0]
        srvrDict['Instance'] = row[1]
        print srvrDict

for serverChk in srvrDict['Server']:
        try:
            c = wmi.WMI(server)
            for os in c.Win32_OperatingSystem():
                osVer = os.caption
        except:                 
            print 'Error connecting to %s to check OS version' % serverChk

        if '2003' in osVer:
            print 'w2k3'
        if '2008' in osVer:
            print 'w2k8'

我想你已经在字典中存储了一个字符串。 因此for serverChk in srvrDict['Server']的行转换for serverChk in yourSavedString 这就是你获得个性化角色的原因。 要访问单独的字典项,您应该for k,v in srvrDict.iteritems()for k,v in srvrDict.iteritems()其中k是键, v是值。

您通过chkbkpstats在循环的每次迭代中覆盖srvrDictServerInstance值,而不是实际生成一个数据序列,其中包含日志文件中每个项目的条目,如您所期望的那样。 您需要将包含字典的列表添加到每个迭代中。 你可能正在寻找更像的东西:

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'

您的代码存在一些问题。

首先,每次执行第一个for循环时都会创建一个新的srvrDict ,并覆盖上次存储在此变量中的值。 我想,你实际打算做的是以下几点:

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

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

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

这样,整个过程看起来像这样:

chkbkpstats = csv.reader(file('c://temp//networkerservers.csv'))
srvrDict = {}
for row in chkbkpstats:
    name, instance = row[0], row[1]
    if name not in srvrDict:
        srvrDict[name] = []
    srvrDict[name].append(instance)

for server in srvrDict:
    for instance in srvrDict[server]:
        try:
            c = wmi.WMI(instance)
        except:                 
            print 'Error connecting to %s to check OS version' % server
        else:
            osVer = c.Win32_OperatingSystem()[0].caption
            if '2003' in osVer:
                print 'w2k3'
            elif '2008' in osVer:
                print 'w2k8'
            else:
                print 'unknown OS'

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM