将字符串转换为数据集

时间:2016-11-04 19:35:46

标签: python python-3.x subprocess

我正在尝试使用python检索接口名称,到目前为止,使用下面的代码,我能够将数据作为字符串获取。因为我只想解析接口名称,所以我使用的是x.split()[]选项,然后尝试检索正常工作的接口名称,但会将每个单词分别拆分为不同的字符串。例如,如果我有很长的接口名称,它将被分为“本地”,“区域”,“网络”而不是单个字符串作为“局域网”。

import subprocess  
p = subprocess.Popen('netsh interface show interface',stdout=subprocess.PIPE) 
[x, err] = p.communicate()
print x.split()

从我想知道的专家是否有办法从结果中检索整个界面名称。

我也尝试将字符串结果转换为数据集,然后获取接口名称,但未成功将数据转换为数据集。

1 个答案:

答案 0 :(得分:0)

x是一个包含\r\n行分隔符的字符串。每个"线"不是以标准方式(例如制表符)分隔,而是由多个空格分隔。有probably an elegant way to handle this

第一行是空的,第二行是标题,第三行只是-----的一行,所以你需要从第4行处理到最后一行。

import subprocess  
import re
p = subprocess.Popen('netsh interface show interface',stdout=subprocess.PIPE) 
[x, err] = p.communicate()
items = x.split('\r\n')
for itm in items[3:]:
    ## convert this to a delimited line for ease of processing:
    itm = re.sub('\s\s+', '\t', itm)
    print(itm.split('\t')[-1])

结果:

enter image description here

或进一步完善:

import subprocess  
import re
p = subprocess.Popen('netsh interface show interface',stdout=subprocess.PIPE) 
[x, err] = p.communicate()
items = x.split('\r\n')
print('\n'.join(map(lambda itm: re.sub('\s\s+', '\t', itm).split('\t')[-1], items[3:])))

从评论更新

  

所以它按预期工作,虽然如果我有4个接口和我只想读第一个,那么最好的方法是什么?我试着调查正则表达式,但无法找到一种方法来保持第一行并从结果中删除休息。

你不需要正则表达式。我使用正则表达式的唯一方法是将多个 space 字符的任何实例转换为\t(制表符)字符,以便我们可以使用split轻松解析这些行。否则,正如您所观察到的那样,它将产生类似'Local', 'Area', 'Network'

的输出

所以我上面的方法假设你想打印所有的名字,我们确定这些项目从stdout的第4行开始。这就是我们做的原因:

for itm in items[3:]:

该行说明"迭代items中的每个事物,从第三个事物直到最后一件事。" This is a concept known as slicing可以在任何序列对象(字符串,元组,列表等)上完成。

  

我在下面有连接,只想知道第一个连接名称并从结果中删除休息。

所以我们不再需要迭代(如果我们需要处理每个项目,那就完成了)。我们知道我们只需要一个项,并且它是第一个项,因此您可以修改为:

import subprocess  
import re
p = subprocess.Popen('netsh interface show interface',stdout=subprocess.PIPE) 
[x, err] = p.communicate()
## This gets the line-delimited list from stdout
items = x.split('\r\n')
## Now, we only need the fourth item in that list
itm = items[3]
## convert this to a delimited line for ease of processing:
itm = re.sub('\s\s+', '\t', itm)
## print to console
print(itm.split('\t')[-1])

或者,更简洁:

import subprocess  
import re
p = subprocess.Popen('netsh interface show interface',stdout=subprocess.PIPE) 
[x, err] = p.communicate()
## This gets the line-delimited list from stdout
items = x.split('\r\n')
""" 
    Now, we only need the fourth item in that list
    convert this to a delimited line for ease of processing, 
    and finally print to console

    This is a one-line statement that does what 3 lines did above
"""
print(re.sub('\s\s+', '\t', items[3]).split('\t')[-1])