簡體   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