2017-10-18 34 views
0

Reformulation complète de l'article original. Ce que j'essaie de faire est d'analyser certaines données ligne par ligne et de créer un dictionnaire. Je pense qu'il y a une meilleure façon d'organiser ces données. La manière originale que j'essayais de faire à ce sujet ne tenait pas compte de plusieurs choses, donc je suis arrivé avec ça. Je parcours en boucle la sortie de la politique de service ligne par ligne pour assembler les données par Interface, nom de la politique, puis en tirant la file d'attente, les gouttes et les gouttes sans tampon. Le problème que je rencontre est que ce n'est pas la prise en compte de la politique supplémentaire, donc le passage initial des données est écrasé.Création d'un dictionnaire imbriqué en python à partir de plusieurs sources de données

sortie Politique de service:

GigabitEthernet11/1 

Service-policy output: Gi11_1 

Counters last updated 7191104 seconds ago 

Class-map: class-default (match-any) 
    0 packets, 0 bytes 
    30 second offered rate 0000 bps, drop rate 0000 bps 
    Match: any 
    Queueing 
    queue limit 33025 packets 
    (queue depth/total drops/no-buffer drops) 0/0/0 
    (pkts output/bytes output) 0/0 
    shape (average) cir 500000000, bc 2000000, be 2000000 
    target shape rate 500000000 

    Service-policy : child 

    Counters last updated 7191104 seconds ago 

    Class-map: class-default (match-any) 
     0 packets, 0 bytes 
     30 second offered rate 0000 bps, drop rate 0000 bps 
     Match: any 
     Queueing 
     queue limit 33025 packets 
     (queue depth/total drops/no-buffer drops) 0/0/0 
     (pkts output/bytes output) 0/0 
     bandwidth remaining ratio 100 

for ints, int_strings in zip(int_names, int_output): 
    counts.setdefault(ints, {}) 

    for line in int_strings.splitlines(): 
     matchpolicy = re.search(r'(Service-policy.*)', line) 
     matchdrops = re.findall(r'total drops.*', line) 
     if matchpolicy: 
      spolicies = matchpolicy.group(0) 
      counts[ints]['Policy'] = spolicies 
     if matchdrops: 
      regx = re.search(r'\s(\d+)\/(\d+)\/(\d+)', line) 
      counts[ints]['queue'] = int(regx.group(1)) 
      counts[ints]['drops'] = int(regx.group(2)) 
      counts[ints]['no-buffer'] = int(regx.group(3)) 

return counts 

J'ai essayé de créer un dictionnaire avec un niveau de profondeur supplémentaire, mais j'obtenir une erreur de clé sur les comptes en ligne [INTS] [spolicies]. D'après ce que j'ai lu, j'ai pensé que c'était ainsi que fonctionnaient les dictionnaires imbriqués, mais je pense avoir mal compris.

for ints, int_strings in zip(int_names, int_output): 
    counts.setdefault(ints, {}) 

    for line in int_strings.splitlines(): 
     matchpolicy = re.search(r'(Service-policy.*)', line) 
     matchdrops = re.findall(r'total drops.*', line) 
     if matchpolicy: 
      spolicies = matchpolicy.group(0) 
      counts[ints][spolicies] 
     if matchdrops: 
      regx = re.search(r'\s(\d+)\/(\d+)\/(\d+)', line) 
      counts[ints][spolicies]['queue'] = int(regx.group(1)) 
      counts[ints][spolicies]['drops'] = int(regx.group(2)) 
      counts[ints][spolicies]['no-buffer'] = int(regx.group(3)) 

return counts 

Quoi qu'il en soit, je suppose qu'il peut y avoir une meilleure façon d'organiser ces données afin que je puisse passer par plus facilement plus tard. Des idées?

+1

[ « Quelqu'un peut-il me aider? » n'est pas une question SO valide] (https://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question). Cela suggère généralement que ce dont vous avez besoin est d'une demi-heure avec un tuteur local ou de suivre un tutoriel, plutôt que Stack Overflow. – Prune

Répondre

0
labels = ["depth", "drops", "buffer_drops"] 
values = ['0', '14996', '0', '0', '2100', '0'] 
keys=['Gi1','Gi2'] 

values_grouped_by_3 = list(zip(*[iter(values)]*3)) 
data = dict(zip(keys,[dict(zip(labels,vals)) for vals in values_grouped_by_3])) 

si vous voulez plus d'un tutoriel et une aide réelle alors s'il vous plaît faire un premier effort et après vos efforts et ce que vous attendiez et ce que votre sortie est

+0

Excuses, tout le code que je proposais n'avait aucun sens alors je ne voulais pas assombrir le post avec ça. J'ai changé mon code tellement de fois à ce stade que je ne suis même pas sûr d'où j'ai commencé. J'avais quelque chose comme: #for interface_strings, header_strings dans header_strings: # intf [header_strings] [interface_strings] .append (externes) (je me rends compte que cela n'a pas été affiché du tout) – pegruder