2013-06-13 4 views
1

У меня есть некоторые данные, что выглядит КакЭто, количество линий может варьироваться:Составьте список в дальнейшие подсписки

? (192.168.30.4) at 00:10:60:0a:70:26 [ether] on vlan20       
? (192.168.30.1) at 70:ca:9b:99:6a:82 [ether] on vlan20 
#etc similar format 

Я хочу, чтобы разобрать это такое, что я могу напечатать что-то вроде этого в таблице:

#Protocol Address   Age (min) Hardware Addr Type Interface   
#Internet 192.168.30.4    - 0010.600a.7026 ARPA Vlan20    
#Internet 192.168.30.1    - 70ca.9b99.6a82 ARPA Vlan20 

я разделил данные по линии в два списка

parse = proc_stdout.split('\n') 

Это дало список из двух элементов:

['? (192.168.30.4) at 00:10:60:0a:70:26 [ether] on vlan20', '? (192.168.30.1) a 
t 70:ca:9b:99:6a:82 [ether] on vlan20', ''] 

Теперь я хочу разбить данные так, чтобы в каждом пространстве списка был создан новый список. Это даст список списков для каждой строки выше. Затем я смог выполнить поиск в каждом списке списков, чтобы извлечь нужные мне данные и распечатать их. Однако вы не можете разбить список? Каков наилучший способ сделать это?

ответ

1

Вы можете использовать strs.splitlines и список понимание здесь:

>>> data="""? (192.168.30.4) at 00:10:60:0a:70:26 [ether] on vlan20       
... ? (192.168.30.1) at 70:ca:9b:99:6a:82 [ether] on vlan20""" 
>>> [line.split() for line in data.splitlines()] 
[['?', '(192.168.30.4)', 'at', '00:10:60:0a:70:26', '[ether]', 'on', 'vlan20'], 
['?', '(192.168.30.1)', 'at', '70:ca:9b:99:6a:82', '[ether]', 'on', 'vlan20'] 
] 

Для получения желаемого результата вы должны использовать строку форматирования здесь:

data="""? (192.168.30.4) at 00:10:60:0a:70:26 [ether] on vlan20       
? (192.168.30.1) at 70:ca:9b:99:6a:82 [ether] on vlan20""" 

print "#Protocol Address   Age (min) Hardware Addr Type Interface" 
for line in data.splitlines(): 
    _,ip,_,har_ad,_,_,interface = line.split() 
    ip = ip.strip('()') 
    it = iter(har_ad.split(':')) 
    har_ad = ".".join([x+y for x,y in zip(it,it)]) 
    print "#Internet {} {:>11s} {:>18s} {:>5s} {:>8s}".format(ip,'-', har_ad,'ARPA' ,interface)   

выход:.

#Protocol Address   Age (min) Hardware Addr Type Interface 
#Internet 192.168.30.4   -  0010.600a.7026 ARPA vlan20 
#Internet 192.168.30.1   -  70ca.9b99.6a82 ARPA vlan20 
+0

тоже спасибо за этот ответ :) – Paul

+0

Я сначала понимаю это,' _, ip, _, har_ad , _, _, interface = line.split() 'вы просто вызываете все, чего не хотите? Это добавляет их все к этой переменной? – Paul

+1

@Paul Это называется [распаковка последовательности] (http://docs.python.org/2/tutorial/datastructures.html), он назначает элементы списка ('line.split()') переменным на LHS.'_' - просто фиктивная переменная, означает игнорировать эти элементы. –

2

Вы можете использовать список понимание или утверждение генератора для этих целей:

parse = proc_stdout.strip('\n').split('\n') 
parsed_list = [line.split() for line in parse] 

или генератор, если Вы будете обрабатывать результат в другую структуру

parse = proc_stdout.strip('\n').split('\n') 
parsed_list = (line.split() for line in parse) 
+1

+1 также OP, вероятно, хочет 'proc_stdout.rstrip ('\ п') Раскол ('\ п')' не иметь пустая строка в конце – jamylak

+0

спасибо @jamylak Я уже заметил это и исправил его, но использовал srtip. Я посмотрю разницу между этим и rstrip. Спасибо, это прекрасно. – Paul

+0

А я вижу, правая полоса. – Paul

Смежные вопросы