2016-11-04 359 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。如果你仍然無法得到它,請問一個*新問題:) –