2016-11-04 355 views
0

我尝试使用python检索接口名称,至此使用下面的代码我可以将数据作为字符串获取。因为我只是想分析接口名称我使用x.split()[]选项,然后试图检索接口名称,它工作正常,但将分开每个单词在不同的字符串中。例如,如果我有很长的接口名称,它将在“本地”,“区域”,“网络”中拆分,而不是一次单个字符串作为“局域网”。将字符串转换为数据集

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

从专家我想知道是否有方法从结果中检索整个接口名称。

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

+0

有你有任何机会尝试解决方案如下 –

+0

@DavidZemens是的,我还想再深入一层。 所以它按预期工作,但如果我有4个接口并且我只想读第一个,那么最好的方法是什么?我试图寻找正则表达式,但无法找到一种方法来保持第一行并从结果中移除其余部分。我正在学习编程,并在提问之前尽力而为。 例如:我有下面的连接,只是想知道第一个连接名称,并从我的结果中删除休息。 端口Ethernet 的Ethernet2 为Ethernet3 以太网端口Ethernet4 – pylearner

回答

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接口和我只想读第一个,那么最好的方法是什么?我试图寻找正则表达式,但无法找到一种方法来保持第一行并从结果中移除其余部分。

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

所以我上面假设你想打印出名字的所有,我们确定这些项目的标准输出的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]) 
+0

它按预期工作但如果我有一个4个接口,我只是想读第一位的,什么是做最好的方法?我试图寻找正则表达式,但无法找到一种方法来保持第一行并从结果中移除其余部分。我正在学习编程,并在提问之前尽力而为。 例如:我有下面的连接,只是想知道第一个连接名称,并从我的结果中删除休息。 端口Ethernet 的Ethernet2 为Ethernet3 以太网端口Ethernet4 – pylearner

+0

@pylearner好了,我增加了更多的答案一些,以及对您的后续行动的解释,但是,我要提醒你反对延长后续Q的在未来(它在这里因为几个原因而皱起了眉头......)。当答案解决了您提出的问题时,您*应*将其标记为“已接受”,或者如果有帮助的话,可以赞成。如果你的意思是*提出一些更具体的问题,或者你忽略了(看似不重要的)重要细节,那么首先你应该*尝试*来修改答案,如果失败了,请根据答案来查看dox。如果你仍然无法得到它,请问一个*新问题:) –