[英]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.