2017-04-26 66 views
-1

我是非常新的python,我需要閱讀下面的文件(實際上下面的輸出得到它從命令)並打印它的輸出。Python來處理文本文件來打印它的輸出

以下是文件:

NIC: 
    Name: eth0 
    ID: 0 1 
    Dynamic MAC Addr: 00:00:00:00:00:01 
    Preference: NONE 

    Ethernet Interface: 
     Name: prod 
     Default Network: Yes 
     VLAN ID: 2 
     Operational VLAN: SWA 
     Config Qual: N/A 

     Name: dev 
     Default Network: No 
     VLAN ID: 3 
     Operational VLAN: SWA 
     Config Qual: N/A 

    Name: eth1 
    Fabric ID: 1 0 
    Dynamic MAC Addr: 00:00:00:00:00:11 
    Preference: NONE 
    Ethernet Interface: 
     Name: prod 
     Default Network: Yes 
     VLAN ID: 2 
     Operational VLAN: SWB 
     Config Qual: N/A 

     Name: dev 
     Default Network: No 
     VLAN ID: 3 
     Operational VLAN: SWB 
     Config Qual: N/A 
  1. 究竟我該怎麼做到的,是我需要找到我多少接口都有。在以上情況下,eth0和eth1。

  2. 我想驗證的eth0具有ID 0 1

  3. 爲eth0,我需要驗證名稱督促是否存在和VLAN ID 2是督促和默認網絡是有

  4. 爲eth0,我需要驗證Name dev是否存在,並且vlan ID 3用於dev,並且Default Network爲no。

對於所有接口類似。通常我會得到eth0 - 20的輸出。

我到目前爲止嘗試實現這一點,並能夠使其使用下面的方法,但下面的代碼是不正確的,因爲它不會工作,如果字段互換。

我實際上在做的是找到eth0並將下面的值重定向到var 1,var2,var3等,然後使用這些var1,var2,var3來獲取我的輸出。

但是,當字段交換和額外的字段添加到輸出文件時,這不會工作。

(下面的代碼注意是的例子,我努力)

我需要在這裏你可以幫助正確的方式來實現這一目標。

from itertools import islice 
import string 
import re 
import os 
import sys 
a = "eth0" 
def silentremove(filename): # remove file 
    try: 
     os.remove(filename) 
    except OSError as e: # this would be "except OSError, e:" 
     if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory 
      raise # re-raise exception if a different error occurred 
file = "inputfile.txt" 
silentremove(file) 
with open("vnic1.txt") as f: # Remove empty lines 
    for line in f: 
     if not line.isspace(): 
      input_file = open('inputfile.txt', 'a') 
      sys.stdout = input_file 
      sys.stdout.write(line) 
      input_file.close() 
      sys.stdout = sys.__stdout__ 
d = {} 
count = 0 
with open('inputfile.txt') as f: 
    for line in f: 
     if (re.search(a, line, re.IGNORECASE)): 
     var1, var2, var3, var4, var5,var6,var7,var8,var9,var10,var11,var12,var13, var14, var15, var16 = islice(f, 16) 
     key, value = var1.strip().split(":", 1) 
     d[key] = value 
     ideth0 = "0 1" 
     if (re.search(ideth0, value, re.IGNORECASE)): 
      count +=1 
     key, value = var5.strip().split(":", 1) 
     d[key] = value 
     name = "prod" 
     if (re.search(name, value, re.IGNORECASE)): 
      count +=1 
     if count == 2: 
      print "Working" 
      print "Status-{}:".format(a) 
      print " ID Name" 
      print " {} {}".format(ideth0, name) 

     else: 
      print "Failed" 
+0

這看起來像一個山藥l文件,爲什麼不使用yaml讀取器來讀取它?例如,['PyYAML'](http://pyyaml.org) – smac89

回答

1

文字看起來LA YAML,但它不是,但它可能是

with open("vnic1.txt") as f: 
    data = f.read() 
# makeing it yaml-string 
data = dat.replace(" Name","- Name") # the 2 spaces are intended 
import yaml 
data = yaml.load(data) # you now have the entire structure as a huge dict, profit 

這樣你就必須在數據像這樣

{ 
    'NIC': [ 
     {'Dynamic MAC Addr': '00:00:00:00:00:01', 
     'Ethernet Interface': [{'Config Qual': 'N/A', 
           'Default Network': True, 
           'Name': 'prod', 
           'Operational VLAN': 'SWA', 
           'VLAN ID': 2}, 
           {'Config Qual': 'N/A', 
           'Default Network': False, 
           'Name': 'dev', 
           'Operational VLAN': 'SWA', 
           'VLAN ID': 3}], 
     'ID': '0 1', 
     'Name': 'eth0', 
     'Preference': 'NONE'}, 
     {'Dynamic MAC Addr': '00:00:00:00:00:11', 
     'Ethernet Interface': [{'Config Qual': 'N/A', 
           'Default Network': True, 
           'Name': 'prod', 
           'Operational VLAN': 'SWB', 
           'VLAN ID': 2}, 
           {'Config Qual': 'N/A', 
           'Default Network': False, 
           'Name': 'dev', 
           'Operational VLAN': 'SWB', 
           'VLAN ID': 3}], 
     'Fabric ID': '1 0', 
     'Name': 'eth1', 
     'Preference': 'NONE'} 
    ] 
} 

這可能不是你要求什麼,但一定會更容易導航(至少你有正確分隔的部分)

+0

讓我試試這個,並且非常感謝 – gopinara