以下示例我从网站上将其从一行中解析vmstat
vmstat | python -c 'import sys; print dict(zip(*map(str.split, sys.stdin)[-2:])).get("id")'
92
但是我试图将其用于代码而不是一行。 ,但我无法获得字典值。它的alwasy NONE
import os
import sys
import subprocess
mydict = {}
cmd = subprocess.Popen('vmstat',stdout=subprocess.PIPE)
msg,err = cmd.communicate()
mydict= zip(*map(str.split, msg)[-2:])
print mydict
任何人都可以帮助我获得字典价值吗?
感谢帮助
答案 0 :(得分:0)
你似乎要照顾\ n角色。我试过这个剪辑了
>>> dict(zip(*map(str.split, msg.split("\n")[1:-1])))
{'wa': '0', 'sy': '1', 'b': '0', 'us': '5', 'bo': '34', 'cache': '872064', 'bi': '150', 'free': '5786860', 'st': '0', 'si': '0', 'r': '2', 'so': '0', 'swpd': '0', 'in': '167', 'cs': '647', 'id': '93', 'buff': '52920'}
现在是一个慢动作脚本:
#split by whitespace (default) all lines unless the first (vmstat caption) and the last one (the last return)
>>> map(str.split, msg.split("\n")[1:-1])
[['r', 'b', 'swpd', 'free', 'buff', 'cache', 'si', 'so', 'bi', 'bo', 'in', 'cs', 'us', 'sy', 'id', 'wa', 'st'], ['2', '0', '0', '5786860', '52920', '872064', '0', '0', '150', '34', '167', '647', '5', '1', '93', '0', '0']]
#create a list of tuples key-value of the previous output
>>> zip(*map(str.split, msg.split("\n")[1:-1]))
[('r', '2'), ('b', '0'), ('swpd', '0'), ('free', '5786860'), ('buff', '52920'), ('cache', '872064'), ('si', '0'), ('so', '0'), ('bi', '150'), ('bo', '34'), ('in', '167'), ('cs', '647'), ('us', '5'), ('sy', '1'), ('id', '93'), ('wa', '0'), ('st', '0')]
#pass that list of tuples to dict function
>>> dict(zip(*map(str.split, msg.split("\n")[1:-1])))
{'wa': '0', 'sy': '1', 'b': '0', 'us': '5', 'bo': '34', 'cache': '872064', 'bi': '150', 'free': '5786860', 'st': '0', 'si': '0', 'r': '2', 'so': '0', 'swpd': '0', 'in': '167', 'cs': '647', 'id': '93', 'buff': '52920'}
答案 1 :(得分:0)
我们跳过第一行并拆分以获取物品 试试这个:
import os
import sys
import subprocess
mydict = {}
cmd = subprocess.Popen('vmstat',stdout=subprocess.PIPE)
msg,err = cmd.communicate()
#we use `-1` index because last element is an empty list
lst = [item.split() for item in msg.split('\n')[1:-1]]
mydict= {k:v for k, v in zip(*map(list, lst))}
print mydict.get('id')
答案 2 :(得分:0)
让我们来看看这里发生了什么:
msg,err = cmd.communicate()
,将返回执行vmstat
命令的消息字符串(输出和错误信息,如果有的话),所以在我的尝试中:
>>>print `msg`
[0]procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
[1] r b swpd free buff cache si so bi bo in cs us sy id wa st
[2] 1 0 194776 69880 31716 207876 0 0 4 4 4 51 2 0 98 0 0
(我已将[0],[1]& [2]添加到下面的其他参考行号,它不属于print msg
)
现在,如果您执行map(str.split, msg)
,则会将所有msg
拆分为单个字符列表的列表,因此您应首先拆分'\n'
。这将为您提供一个字符串列表(如果需要,可以单独行),然后在{2}行([1]& [2])上使用zip
应用str.split
从行中获取一个键[ 1]和第[2]行的值,这样:
mylist = msg.split('\n')[1:3] #line [1] & [2]
mydict = dict(zip(*map(str.split, mylist)))
这应该会为您提供一个字典,其中包含第[1]行的键和第[2]行的值