[英]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
在循環的每次迭代中覆蓋srvrDict
的Server
和Instance
值,而不是實際生成一個數據序列,其中包含日志文件中每個項目的條目,如您所期望的那樣。 您需要將包含字典的列表添加到每個迭代中。 你可能正在尋找更像的東西:
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.