Python解析WiFi SSID数据

3
我目前有以下内容。但我注意到,如果SSID包含空格,则顺序会出错:
import subprocess
import csv

process = subprocess.Popen(['/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport', '-s'], stdout=subprocess.PIPE)
stdout, stderr = process.communicate()

reader = csv.DictReader(stdout.decode('ascii').splitlines(),
                        delimiter=' ', skipinitialspace=True,
                        fieldnames=['wifi_name', 'mac', 'strength'])

for row in reader:
    print(row)

我的目标是获取存储的SSID、mac地址和信号强度,以便与电子表格进行比较。

我使用awk '{print $1;}'进行了查看,结果相同。 - beoliver
1个回答

5

airport --help 命令中:

-x        --xml                Print info as XML

这将以苹果的XML格式输出属性列表中的信息,应该更可靠地解析。Python甚至带有一个plistlib模块,可以将XML解析为Python字典:

#!/usr/bin/env python
from subprocess import Popen, PIPE
from plistlib import readPlist
from pprint import pprint

AirportPath = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport'

proc = Popen([AirportPath, '-s', '-x'], stdout=PIPE)

ssid_data = readPlist(proc.stdout)
pprint(ssid_data)

我会使用 xml.etree 来完成这个任务吗?只是确认一下我走在正确的轨道上 :) - beoliver
@user969617:Python自带一个用于读取plist文件的库,我会将其编辑到答案中。 - millimoose
抱歉问这个愚蠢的问题,但我该怎么做呢?如果我保存xml文件,然后使用from plistlib import readPlist``pl = readPlist('/Users/name/Library/Scripts/wifiinfo')``print(pl[1]),但我能否在不先保存文件的情况下完成它? - beoliver
readPlist文档中写道:“pathOrFile可以是文件名或(可读取的)文件对象”。进程的标准输出应该被视为“可读取的文件”。 - millimoose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接