2017-10-17 4 views
2

Je suis nouveau sur python et j'essaie de lire un fichier et de créer un dictionnaire à partir de celui-ci. Le format est le suivant:créer un dictionnaire à partir du fichier python

.1.3.6.1.4.1.14823.1.1.27 { 
    TYPE = Switch 
    VENDOR = Aruba 
    MODEL = ArubaS3500-48T 
    CERTIFICATION = CERTIFIED 
    CONT = Aruba-Switch 
    HEALTH = ARUBA-Controller 
    VLAN = Dot1q INSTRUMENTATION: 
    Card-Fault   = ArubaController:DeviceID 
    CPU/Memory   = ArubaController:DeviceID 
    Environment    = ArubaSysExt:DeviceID 
    Interface-Fault  = MIB2 
    Interface-Performance = MIB2 
    Port-Fault   = MIB2 
    Port-Performance  = MIB2 
} 

La première ligne OID (.1.3.6.1.4.1.14823.1.1.27 {) Je veux que ce soit la clé et les lignes restantes sont les valeurs jusqu'à ce que le}

J'ai essayé quelques combinaisons, mais je ne suis pas en mesure d'obtenir la bonne regex pour correspondre à ces

Une aide s'il vous plaît?

J'ai essayé quelque chose comme

lines = cache.readlines() 

for line in lines: 

    searchObj = re.search(r'(^.\d.*{)(.*)$', line) 

    if searchObj: 
     (oid, cert) = searchObj.groups() 

    results[searchObj(oid)] = ", ".join(line[1:]) 

    print("searchObj.group() : ", searchObj.group(1)) 

    print("searchObj.group(1) : ", searchObj.group(2)) 
+0

oui c'est toujours .1.3.6.1.4.x.x.x.x – D2D2

Répondre

1

Vous pouvez essayer ceci:

import re 
data = open('filename.txt').read() 
the_key = re.findall("^\n*[\.\d]+", data) 
values = [re.split("\s+\=\s+", i) for i in re.findall("[a-zA-Z0-9]+\s*\=\s*[a-zA-Z0-9]+", data)] 
final_data = {the_key[0]:dict(values)} 

Sortie:

{'\n.1.3.6.1.4.1.14823.1.1.27': {'VENDOR': 'Aruba', 'CERTIFICATION': 'CERTIFIED', 'Fault': 'MIB2', 'VLAN': 'Dot1q', 'Environment': 'ArubaSysExt', 'HEALTH': 'ARUBA', 'Memory': 'ArubaController', 'Performance': 'MIB2', 'CONT': 'Aruba', 'MODEL': 'ArubaS3500', 'TYPE': 'Switch'}} 
1

Vous pouvez utiliser une compréhension dict imbriquée avec un extérieur et regex interne.


Vos blocs peuvent être séparés par

.numbers...numbers.. { 
    // values here 
} 

En termes d'expression régulière, cela peut être formulé comme

^\s*     # start of line + whitespaces, eventually 
(?P<key>\.[\d.]+)\s* # the key 
{(?P<values>[^{}]+)} # everything between { and } 

Comme vous le voyez, nous avons divisé les parties en paires clé/valeur.


votre structure "intérieure" peut être formulé comme

(?P<key>\b[A-Z][-/\w]+\b) # the "inner" key 
\s*=\s*     # whitespaces, =, whitespaces 
(?P<value>.+)    # the value 


Maintenant, nous allons construire le "extérieur" et les expressions "internes" ensemble:

rx_outer = re.compile(r'^\s*(?P<key>\.[\d.]+)\s*{(?P<values>[^{}]+)}', re.MULTILINE) 
rx_inner = re.compile(r'(?P<key>\b[A-Z][-/\w]+\b)\s*=\s*(?P<value>.+)') 

result = {item.group('key'): 
    {match.group('key'): match.group('value') 
    for match in rx_inner.finditer(item.group('values'))} 
    for item in rx_outer.finditer(string)} 
print(result) 

A demo can be found on ideone.com.