来自CMD输出的Python列表

时间:2014-11-12 14:25:15

标签: python windows cmd wifi netsh

尝试使用python从CMD输出解析SSID,BSSID和Signal的值。令我困惑的是如何每次将这三个值存储在列表列表中。我可以为每一行做这样的事情。

import subprocess, re

cmd = subprocess.Popen('netsh wlan show networks mode=BSSID',
shell=True, stdout=subprocess.PIPE) 
for line in cmd.stdout:
    if "BSSID" in line:
        print re.search(r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})', line, re.I).group()

但问题是我能理解这不是一个好习惯。 我想要实现的是在列表中使用SSID,BSSID和Signal,这样我就可以打印列表中的任何信息。例如,从我的列表中打印第二个接入点的BSSID ,或者在APS中打印AP:打印SSID 。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

以下是将输出解析为字典列表的方法:

import subprocess

ssid = {}
ssids = []
cmd = subprocess.Popen('netsh wlan show networks mode=BSSID',
                       shell=True, stdout=subprocess.PIPE) 
for line in cmd.stdout:
    l = map(lambda x: x.strip(), line.strip().split(":"))
    if len(l) > 1:
        key, value = l[0], l[1]
        if key.startswith("SSID"):
            key = "name"
            if ssid:
                ssids.append(ssid)
            ssid = {}
            ssid[key] = value
        if "name" in ssid:
            ssid[key] = value
ssids.append(ssid)

# example of how to use ssids, list of ssid dictionaries
for ssid in ssids:
    print ssid["name"], ssid["Encryption"]

答案 1 :(得分:0)

同样在您的原始代码中,您使用的是.group(),它将返回该行的整个匹配部分。

您可以使用group()和位置参数从reg ex获取该组。例如group(2)会从正则表达式([0-9A-F]{2})返回第二项。

要返回可以附加到列表的项目元组,只需使用groups()即可。

例如,假设正则表达式正确,请更改此部分;

mylist=list() 
for line in cmd.stdout:
    if "BSSID" in line:
       mylist.append(re.search(r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})', line, re.I).groups())

在上面的mylist中包含一个元组列表,其中包含每行的摘录。