2013-04-23 17 views
5

Próbuję napisać skrypt w języku Python w systemie Windows 7, który odczytuje dane wyjściowe polecenia ipconfig /displaydns i próbuje uzyskać pewne wartości z wyjścia.Parsowanie wyników polecenia w Pythonie

Wyjście ipconfig /displaydns" jest coś takiego,

Windows IP Configuration 

9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts. 

Record Name . . . . . : 9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts. 
Record Type . . . . . : 1 
Time To Live . . . . : 294 
Data Length . . . . . : 4 
Section . . . . . . . : Answer 
A (Host) Record . . . : 127.0.0.16 

Biorę to wyjście i zapisanie go w zmiennej jak poniżej,

output = subprocess.check_output("ipconfig /displaydns", shell=True) 

Podczas drukowania „Wyjście” Otrzymuję po

b'\r\nWindows IP Configuration\r\n\r\n 9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts.\r\n ----------------------------------------\r\n Record Name . . . . . : 9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts.\r\n Record Type . . . . . : 1\r\n Time To Live . . . . : 289\r\n Data Length . . . . . : 4\r\n Section . . . . . . . : Answer\r\n A (Host) Record . . . : 127.0 .0.16\r\n\r\n\r\n' 

Z tego wyniku interesują mnie wartości A (Host) Record i Record Name, które są odpowiednio 127.0.0.16 i 9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts..

Jak mógłbym to zrobić w Pythonie?

+0

'o utput.split ('') '? (Edycja: po edycji, to nie jest prawidłowe) – Torxed

Odpowiedz

11
import subprocess 
output = subprocess.check_output("ipconfig /displaydns", shell=True) 
result = {} 
for row in output.split('\n'): 
    if ': ' in row: 
     key, value = row.split(': ') 
     result[key.strip(' .')] = value.strip() 

print(result) 
print(result['A (Host) Record']) 

daje:

{'A (Host) Record': '127.0 .0.16', 'Data Length': '4', 'Section': 'Answer', 'Record Name': '9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts.', 'Time To Live': '289', 'Record Type': '1'} 
127.0 .0.16 

Innym rozwiązaniem byłoby: (kiedy myślałem o tym w mojej głowie, myślałem, że będzie bardziej zwarty .. ale nie było tak czy inaczej, jest to inny sposób wywoływania zewnętrznego polecenia, w którym masz kontrolę nad błędami i wyjściem (możesz je rozróżnić))

import subprocess 
cmdpipe = subprocess.Popen("ipconfig /displaydns", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 
result = {} 
for row in cmdpipe.stdout.readline(): 
    if ': ' in row: 
     key, value = row.split(': ') 
     result[key.strip(' .')] = value.strip() 

print(result) 
print(result['A (Host) Record']) 
+0

Dzięki. Działa idealnie. Dziękuję bardzo. – user2253876

+0

@ user2253876 Nie ma za co, proszę zapomnieć zaznaczyć swoją odpowiedź (sprawia mi to przyjemność w środku) :) – Torxed