Преобразование строки в набор данных

I am in try to retrieve Interface Name using python and so far with below code I am able to get data as string. Так как я просто хочу разобрать имя интерфейса, я использую x.параметр split () [], а затем пытается получить имя интерфейса, который работает нормально, но будет разбивать каждое слово по отдельности в другой строке. Например, если у меня есть длинное имя интерфейса, он будет разделен на “Local”, “Area”, “Network” вместо одной строки как “Local Area Network”.

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

От экспертов я хочу знать, есть ли способ получить полное имя интерфейса из результата.

Я также попытался преобразовать результат строки в набор данных, а затем захватить имя интерфейса, но не преуспел в преобразовании данных в набор данных.

1 ответ

  1. x строка с \r\nразделителями строк. Каждая «строка» разделена не стандартным образом (например, табуляцией), а несколькими пробелами. Вероятно, есть элегантный способ справиться с этим .

    Первая строка пустая, вторая строка заголовки, третья строка просто строка-----, поэтому вам нужно обработать от строки 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])
    

    Результаты:

    Введите описание изображения здесь

    Или более добавочно уточненный:

    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 интерфейса , и я просто хочу прочитать первый, что было бы лучшим способом сделать это? Я попытался заглянуть в regex, но не смог найти способ просто сохранить первую строку и удалить rest из результатов.

    Для этого вам не понадобится regex. Единственное, для чего я использовал regex, было преобразование любого экземпляра множественного символа пространства \tв символ (tab), чтобы мы могли легко анализировать строки с помощью split. В противном случае, как вы заметили, он будет производить такие результаты, как 'Local', 'Area', 'Network'

    Таким образом, подход, который я выше предположил, что вы хотели распечатать все имена, и мы определили, что эти пункты начинаются в строке 4 stdout. Вот почему мы это сделали:

    for itm in items[3:]:
    

    Эта строка говорит: «повторяйте каждую вещьitems, начиная с третьей вещи до самой последней вещи.»Это понятие, известное как срезание, которое может быть сделано на любом объекте последовательности (строка, кортеж, список и т.д.)

    У меня есть ниже для соединений и просто хочу знать имя первого соединения и удалить rest из моего результата.

    Таким образом, нам больше не нужна итерация (что делается, если нам нужно обработать каждый элемент). Мы знаем, что нам нужен только один пункт, и это первый пункт, поэтому вы можете пересмотреть как:

    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])