Python没有输出实际结果

时间:2016-04-06 12:11:24

标签: python

我目前正在编制一个列表,其中只包含该区域内所有可用网络的ESSID,以用于其他目的。

这是剧本:

from subprocess import check_output
scanoutput = check_output(["iwlist", "wlan0", "scan"])

for line in scanoutput.split():
        if line.startswith("ESSID:"):
                line=line[7:-1]
                print line

当我从SSH运行命令“sudo iwlist wlan0 scan | grep ESSID”时,这是输出:

            ESSID:"easybell DSL"
            ESSID:"FRITZ!Box Fon WLAN 7360 SL_EXT"
            ESSID:"NoTrespassing"
            ESSID:"WLAN-519293"
            ESSID:"Cinque"
            ESSID:"EasyBox-738461"
            ESSID:"FRITZ!Box WLAN 3270"
            ESSID:"EasyBox-A2B246"

可悲的是,Python脚本输出:

easybel
FRITZ!Bo
NoTrespassing
WLAN-519293
Cinque
EasyBox-738461
FRITZ!Bo
EasyBox-A2B246

仔细检查一下,当有空间时它看起来像是笨拙的,但它似乎也会在打印之前删除空格前的最后一个字母。有人可以解释这里发生了什么吗?

据我所知,是来自代码

line=line[7:-1]

是7负责删除前7个字符,因此:ESSID:“和-1从最后一个负责”因此产生一个只有SSID名称的简洁行。

当我运行没有此行的代码时,这是输出:

ESSID:"easybell
ESSID:"NoTrespassing"
ESSID:"WLAN-519293"
ESSID:"Cinque"
ESSID:"EasyBox-738461"
ESSID:"FRITZ!Box
ESSID:"FRITZ!Box

如何从SSH线路获取正确的信息,但是当我让python运行代码时它会丢失部分?

有什么方法可以解决这个问题吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

split()默认剪切任何空格,您需要将split()分隔符明确设置为\n

  

string.split(s [,sep [,maxsplit]]):如果缺少可选的第二个参数sep或None,则单词由空格字符的任意字符串分隔(空格,制表符,换行符,返回,换页)

>>> test = '''
ESSID:"easybell DSL"
ESSID:"FRITZ!Box Fon WLAN 7360 SL_EXT"
ESSID:"NoTrespassing"
[...]
'''
>>> for l in test.split():
...     if l.startswith('ESSID'):
...         print(l[7:-1])
...         
easybel
FRITZ!Bo
NoTrespassing
[...]
>>> for l in test.split('\n'):
...     if l.startswith('ESSID'):
...         print(l[7:-1])
...         
easybell DSL
FRITZ!Box Fon WLAN 7360 SL_EXT
NoTrespassing
[...]

或使用splitlines()

>>> for l in test.splitlines():
...     if l.startswith('ESSID'):
...         print(l[7:-1])
...         
easybell DSL
FRITZ!Box Fon WLAN 7360 SL_EXT
NoTrespassing
[...]

答案 1 :(得分:1)

你在输出上使用了split(),它在任何空格上划分(不仅仅是换行符),因此line实际上设置为ESSID:"easybell然后DSL"和然后ESSID:"FRITZ!Box等。请注意,由于最终"ESSID不在同一个字词中,line[7:-1]最终会切断ESSID:"easybell中的最后一个字符},所以你最终得到了easybel。你想要做的是for line in scanoutput.splitlines():

答案 2 :(得分:1)

这不会删除最后一个字符(仅限开始/结束引号)。执行line = line.strip()可确保startswith("ESSID:")因为白色空格而失败,因为#34; ESSID:"。

from subprocess import check_output
scanoutput = check_output(["iwlist", "wlan0", "scan"])
for line in scanoutput.split("\n"):
    line = line.strip()
    if line.startswith("ESSID:"):
        line=line[7:-1]
        print line