如何让for循环遍历变量中的行而不是字符?

3
我有以下代码可以通过SSH连接到节点,并查找其他设备的RSSI。
bot_ipv6是需要SSH连接的IPv6地址列表,脚本使用pexpect进行SSH连接。
for address in bot_ipv6:
    session=spawn('ssh -6 root@'+address+'%wlan0')
    #session.logfile = stdout
    session.expect('password:')
    session.sendline("123456")
    session.expect(prompt)
    session.sendline("iwlist wlan0 scan")
    session.expect(prompt)
    data=session.before
    session.close()

现在data变量包含了iwlist wlan0 scan命令在该设备上的输出。

我想要检查这份数据,只获取地址和相应的RSSI值。当该命令可以在本地运行并输出到文件时,以下代码能够正常工作:

with open("rssi.txt") as fd:
    for line in fd:
        cell_line = match(line,"Cell ")
        if cell_line != None:
            cells.append([])
            line = cell_line[-27:]
        cells[-1].append(line.rstrip())


for cell in cells:
    level.append(matching_line(cell,"Quality=").split()[2].split('=')[1])
    address.append(matching_line(cell,"Address: "))

scanned=dict(zip(address, level))

匹配和匹配行是在其他地方定义的函数,它们会在文件中查找与我要查找的字符匹配的内容。

我的问题是我不知道如何将数据输出到文件中,但如果我像在使用文件时一样逐行遍历输出数据:

for line in data:
        cell_line = match(line,"Cell ")
        if cell_line != None:
            cells.append([])
            line = cell_line[-27:]
        cells[-1].append(line.rstrip())

不是遍历每行,而是遍历每个字符。

我该如何将输出打印到一个本地文件中并像之前一样扫描每一行数据,或者如何遍历数据中的每一行而不是单个字符?

以下是数据的示例(获取数据的方法是将“print data”放入脚本中,然后从输出中复制它并粘贴到这里,希望不会丢失格式):

iwlist wlan0 scan
wlan0     Scan completed :
          Cell 01 - Address: 02:CA:FF:EE:BA:BE
                    Channel:11
                    Frequency:2.462 GHz (Channel 11)
                    Quality=47/70  Signal level=-63 dBm  
                    Encryption key:off
                    ESSID:"nenenenenene-batman"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s
                    Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Ad-Hoc
                    Extra:tsf=00000000f8083cfe
                    Extra: Last beacon: 72ms ago
                    IE: Unknown: 00136E656E656E656E656E656E652D6261746D616E
                    IE: Unknown: 010882840B160C121824
                    IE: Unknown: 03010B
                    IE: Unknown: 06020000
                    IE: Unknown: 32043048606C
          Cell 02 - Address: D8:5D:4C:AF:C3:14
                    Channel:11
                    Frequency:2.462 GHz (Channel 11)
                    Quality=21/70  Signal level=-89 dBm  
                    Encryption key:on
                    ESSID:"phome"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
                              24 Mb/s; 36 Mb/s; 54 Mb/s
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s
                    Mode:Master
                    Extra:tsf=000000ff16ee018d
                    Extra: Last beacon: 3824ms ago
                    IE: Unknown: 000570686F6D65
                    IE: Unknown: 010882848B962430486C
                    IE: Unknown: 03010B
                    IE: Unknown: 2A0104
                    IE: Unknown: 2F0104
                    IE: Unknown: 32040C121860
                    IE: Unknown: 2D1A7C181BFFFF000000000000000000000000000000000000000000
                    IE: Unknown: 3D160B001700000000000000000000000000000000000000
                    IE: Unknown: DD090010180203F4010000
                    IE: Unknown: DD1E00904C337C181BFFFF000000000000000000000000000000000000000000
                    IE: Unknown: DD1A00904C340B001700000000000000000000000000000000000000
1个回答

15

使用 str.splitlines 将字符串分割成行:

for line in data.splitlines():
    # Do things.

这个完美地运行了。感谢您如此迅速的回复。我会在确认后标记为正确的。 - mark mcmurray

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