2016-11-04 1 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 интерфейса, и я просто хочу прочитать первый, что было бы лучшим способом сделать это? Я пробовал искать регулярное выражение, но не смог найти способ просто сохранить первую строку и удалить остальную часть результатов. Я изучаю программирование и стараюсь изо всех сил, прежде чем спрашивать. Пример: У меня есть ниже для подключения и просто хочу узнать имя первого соединения и удалить остальную часть из моего результата. Ethernet1 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:]))) 

Обновление от Комментарии

так это ж orks по назначению, хотя, если у меня есть 4 интерфейса и Я просто хочу прочитать первый, что было бы лучшим способом сделать это? Я пробовал искать регулярное выражение, но не смог найти способ просто сохранить первую строку и удалить остальную часть результатов.

Для этого не требуется регулярное выражение. Единственное, что я использовал regex for, было преобразование любого экземпляра из нескольких символов пробела в символ \t (tab), чтобы мы могли легко разобрать строки, используя 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 интерфейса и я просто хочу прочитать первый, что было бы лучшим способом сделать это? Я пробовал искать регулярное выражение, но не смог найти способ просто сохранить первую строку и удалить остальную часть результатов. Я изучаю программирование и стараюсь изо всех сил, прежде чем спрашивать. Пример: У меня есть ниже для подключения и просто хочу узнать имя первого соединения и удалить остальную часть из моего результата. Ethernet1 Ethernet2 Ethernet3 Ethernet4 – pylearner

+0

@pylearner ОК, я добавил еще немного к ответу, а также объяснения о ваших продолжений, однако, я хотел бы предостеречь вас от расширенной последующих Q в будущем (это нахмуривается здесь по нескольким причинам ...). Когда ответ решает вопрос, который вы задали, вы * должны * отмечать его как «Принято» или «вверх», если это полезно. Если вы * имели в виду * задавать несколько более конкретный вопрос или вы не учитывали (по-видимому, un) важные детали, тогда сначала вы должны * попытаться * адаптировать ответ, а если это не удается, просмотрите dox в свете этого ответа. Если вы все еще не можете получить его, задайте * новый * вопрос :) –