如何打印值的方法

2024-09-20 05:26:08 发布

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

我正在从vcenter检索数据并打印每个exs主机的值。问题是出于某种原因,我打印了两次某些值。我需要确保只打印一次相同的值:

下面是一个示例结果集:

    name => web01 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-648 summary.quickStats.overallCpuUsage => 3149 summary.quickStats.overallMemoryUsage => 87051

name => web02 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-658 summary.quickStats.overallCpuUsage => 4909 summary.quickStats.overallMemoryUsage => 144503

name => web03 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-664 summary.quickStats.overallCpuUsage => 2659 summary.quickStats.overallMemoryUsage => 123063

name => web04 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-670 summary.quickStats.overallCpuUsage => 1445 summary.quickStats.overallMemoryUsage => 111676

name => web05 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-856 summary.quickStats.overallCpuUsage => 983 summary.quickStats.overallMemoryUsage => 116179

name => web05 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-856 summary.quickStats.overallCpuUsage => 983 summary.quickStats.overallMemoryUsage => 116179

name => web06 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-858 summary.quickStats.overallCpuUsage => 1073 summary.quickStats.overallMemoryUsage => 141572

name => web06 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-858 summary.quickStats.overallCpuUsage => 1073 summary.quickStats.overallMemoryUsage => 141572

我已将代码更新为:

for item in results:
        props = dict((p.Name, p.Val) for p in item.PropSet)
        name = props['name']
        tt=int(time.time())

        Ballooned_Memory = props.get('summary.quickStats.balloonedMemory')
        if Ballooned_Memory is not None:
                Metric="vSphereGuest.ballooned_memory"
                print Metric,tt,Ballooned_Memory,"vSphereGuest="+name.replace('"', ''),"source=vSphereGuest","dc=dc1"

        Cpu_Demand = props.get('summary.quickStats.overallCpuDemand')
        if Cpu_Demand is not None:
                Metric="vSphereGuest.Cpu_Demand"
                print Metric,tt,Cpu_Demand,"vSphereGuest="+name.replace('"', ''),"source=vSphereGuest","dc=dc1"

它遍历每个结果集并打印出值。似乎还剩下一个问题。如果结果集包含重复项(它来自这样的源代码),我将打印两次相同的数据集。我如何修改它,使我只打印出一个,而不管有多少相同的结果集来自源代码?你知道吗


Tags: namehostcpusummarypropsmetrichardwaredemand
3条回答

尝试使用set()来处理您已经打印的内容:

cache = set()
for item in results:
    for r in item.PropSet:
        if r.Name == "name":
            for p in item.PropSet:
                try:
                    v = p.Val
                except AttributeError:
                    #We don't care the property without val attribute
                    continue
                if not v in cache:
                    cache.add(v)
                    if p.Name=="summary.capacity":
                        Total_Space=v
                        Metric="vSphereDatastore.space_total"
                        print Metric,int(time.time()),v,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1"

                    if p.Name=="summary.freeSpace":
                        Free_Space=v
                        Metric="vSphereDatastore.space_free"
                        print Metric,int(time.time()),v,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1"

基于大量的评论和更新,问题变得更加清晰了。再次更新,获取更多新数据:

class Seen(set):
    def seen(self, x):
        answer = x in self
        self.add(x)
        return answer

previously = Seen()
for item in results:
    props = dict((p.Name, p.Val) for p in item.PropSet)
    name = props['name']
    if previously.seen(name):
        continue
    Total_Space = props.get('summary.capacity')
    if Total_Space is not None:
        Metric="vSphereDatastore.space_total"
        print Metric,int(time.time()),Total_Space,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1"
    Free_Space = props.get('summary.freeSpace')
    if Free_Space is not None:
        Metric="vSphereDatastore.space_free"
        print Metric,int(time.time()),Free_Space,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1"

原始代码的问题是,您正在进行双重迭代,效果不佳。这将通过创建一个临时字典,其中包含在item.PropSet中找到的所有键值组合,稍微清理这个过程。如果item.PropSet支持索引(item.PropSet['name'])或获取(item.PropSet.get('name')),那么创建props是多余的,可以用item.PropSet代替props。如果没有,请保持props。无论哪种方式,您现在都可以直接访问属性集中的每个键值对。你知道吗

道具看起来像这样(对于'web-03'):

{'config.hardware.memoryMB': '4096',
 'config.hardware.numCPU': '2',
 'name': 'web-03',
 'summary.quickStats.balloonedMemory': '0',
 'summary.quickStats.hostMemoryUsage': '4140',
 'summary.quickStats.overallCpuDemand': '1777',
 'summary.quickStats.overallCpuUsage': '1031',
 'summary.quickStats.staticCpuEntitlement': '1099',
 'summary.quickStats.swappedMemory': '0',
 'summary.runtime.host': 'host-648'}

您仍然有一个严重的问题,根据您为for p in item.PropSet: print p.Name, "=>", p.Val, print "\n"报告的结果,您要查找的属性键('summary.capacity''summary.freeSpace')中的都没有出现在item.PropSet。你知道吗

但是一旦你发现了这一点,你还可以做其他的改进,例如,通过抽象出一些重复的代码。例如:

def print_metric(metric, value, datastore, source="vSphereDatastore", dc='dc1'):
    print metric, int(time.time()), value,"datastore="+datastore,"source="+source,"dc="+dc

previously = Seen()
for item in results:
    props = dict((p.Name, p.Val) for p in item.PropSet)
    name = props['name']
    if previously.seen(name):
        continue
    Total_Space = props.get('summary.capacity')
    if Total_Space is not None:
        print_metric("vSphereDatastore.space_total", Total_Space, name)
    Free_Space = props.get('summary.freeSpace')
    if Free_Space is not None:
        print_metric("vSphereDatastore.space_free", Free_Space, name)

或者更多的备用:

def print_metric(metric, value, datastore, source="vSphereDatastore", dc='dc1'):
    if value is None:
        return
    print metric, int(time.time()), value,"datastore="+datastore,"source="+source,"dc="+dc

previously = Seen()
for item in results:
    props = dict((p.Name, p.Val) for p in item.PropSet)
    name = props['name']
    if previously.seen(name):
        continue
    print_metric("vSphereDatastore.space_total", props.get('summary.capacity'), name)
    print_metric("vSphereDatastore.space_free", props.get('summary.freeSpace'), name)

您似乎在以嵌套方式对item.PropSet进行迭代,首先使用r,然后使用p。请尝试:

for item in results:
    for p in item.PropSet:
        if p.Name=="summary.capacity":
            Total_Space=p.Val
            Metric="vSphereDatastore.space_total"
            print Metric,int(time.time()),p.Val,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1"
        elif p.Name=="summary.freeSpace":
            Free_Space=p.Val
            Metric="vSphereDatastore.space_free"
            print Metric,int(time.time()),p.Val,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1"

相关问题 更多 >