Linux命令输入字典 - python

时间:2016-01-02 17:08:00

标签: python linux

以下示例我从网站上将其从一行中解析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

任何人都可以帮助我获得字典价值吗?

感谢帮助

3 个答案:

答案 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]行的值