1
votes

Erreur clé lors de l'ajout des détails au dictionnaire

J'ai un journal de test comme ci-dessous. Essayer de mieux le lire. Erreur clé lors de l'ajout d'éléments au dictionnaire. tout en vérifiant la condition si aucune sortie n'est générée et en faisant elif a obtenu une erreur de clé

[{'Server-1A': [('linked', 'Jan 23 2016 11:30:08AM'), ('dislinked', 'Jan 23 2016 10:43:44PM')]},  
{'Server-1B': [('linked', 'Jan 23 2016 12:04:56AM'), ('dislinked', 'Jan 23 2016 2:18:32PM')]},  
{'Server-1A': [('linked', 'Feb 1 2016  1:40:28AM'), ('dislinked', 'Mar 29 2016 2:13:07PM')]},  
{'Server-1A': [('linked', 'Jan 23 2016 11:30:08AM'), ('dislinked', 'Jan 23 2016 10:43:44PM')]},  
{'Server-1B': [('linked', 'Jan 23 2016 12:04:56AM'), ('dislinked', 'Jan 23 2016 2:18:32PM')]},  
{'Server-1A': [('linked', 'Feb 1 2016  1:40:28AM'), ('dislinked', 'Mar 29 2016 2:13:07PM')]},  
{'Server-1A': [('linked', 'Jan 23 2016 11:30:08AM'), ('dislinked', 'Jan 23 2016 10:43:44PM')]},  
{'Server-1B': [('linked', 'Jan 23 2016 12:04:56AM'), ('dislinked', 'Jan 23 2016 2:18:32PM')]},  
{'Server-1A': [('linked', 'Feb 1 2016  1:40:28AM'), ('dislinked', 'Mar 29 2016 2:13:07PM')]},  
{Dos:['201.10.0.4','192.168.123.4']}]

Code

result = []
_dict = {}
spu = []
with open(r'C:\Users\Desktop\test.log') as f:
    for line in f:
        date, rest = line.split(' - ', 1)
        conn_disconn = rest.split(' ')[3]
        server_name = rest.split(' ')[2]
        if line.strip()[-1].isdigit():
            dos = re.findall('[0-9]+(?:\.[0-9]+){3}',line)
            spu.extend(dos)
        ##Error part is below
        if conn_disconn  == 'linked':
            dict_to_append = {server_name: [(conn_disconn, date)]}
            print (dict_to_append)
            _dict[server_name] = dict_to_append
            result.append(dict_to_append)
        elif conn_disconn == 'dislinked':
            _dict[server_name][server_name].append(conn_disconn,date)
            del _dict[server_name]
print (result)

Sortie attendue p >

Jan 23 2016 10:30:08AM - bla bla Server-1A linked
Jan 23 2016 11:04:56AM - bla bla Server-1B linked
Jan 23 2016 1:18:32PM - bla bla Server-1B dislinked from server
Jan 23 2016 4:16:09PM - bla bla DOS activity from 201.10.0.4
Jan 23 2016 9:43:44PM - bla bla Server-1A dislinked from server
Feb 1 2016 12:40:28AM - bla bla Server-1A linked
Feb 1 2016 1:21:52AM - bla bla DOS activity from 192.168.123.4
Mar 29 2016 1:13:07PM - bla bla Server-1A dislinked from server


3 commentaires

Les clés de dictionnaire doivent être uniques docs.python.org/3/tutorial/datastructures.html #dictionnaires


sa liste de dictionnaire pas un dictionnaire unique


dictio = [{'clé1': 'valeur1'}, {'clé1': 'valeur2'}]


3 Réponses :


0
votes

append prend un argument mais vous en avez donné deux dans certains cas. Regardez les paramètres append de cette ligne dans votre code.

_dict[server_name][server_name].append((conn_disconn,date))

Au lieu de cela, vous devez ajouter des parantheses afin de passer le tuple comme ceci:

_dict[server_name][server_name].append(conn_disconn,date)


2 commentaires

J'ai testé le code et cela a fonctionné. Veuillez ajouter votre erreur complète.


Merci, il y a eu un nouveau problème de ligne, qui n'a pas pu voir



0
votes

Lorsque vous vérifiez si conn_disconn == 'linked': , conn_disconn a linked \ n donc il ne s'ajoute pas au dictionnaire et vous obtenez l'erreur clé.

[{'Server-1A': [('linked', 'Jan 23 2016 10:30:08AM'), ('dislinked', 'Jan 23 2016 9:43:44PM')]}, {'Server-1B': [('linked', 'Jan 23 2016 11:04:56AM'), ('dislinked', 'Jan 23 2016 1:18:32PM')]}, {'Server-1A': [('linked', 'Feb 1 2016 12:40:28AM'), ('dislinked', 'Mar 29 2016 1:13:07PM')]}]

Résultat:

import re
result = []
_dict = {}
spu = []
with open("r'C:\Users\Desktop\test.log'") as f:
    for line in f:
        date, rest = line.split(' - ', 1)
        conn_disconn = rest.split(' ')[3].strip()
        server_name = rest.split(' ')[2]
        if line.strip()[-1].isdigit():
            dos = re.findall('[0-9]+(?:\.[0-9]+){3}',line)
            spu.extend(dos)
        ##Error part is below
        if conn_disconn  == 'linked':
            dict_to_append = {server_name: [(conn_disconn, date)]}
            print (dict_to_append)
            _dict[server_name] = dict_to_append[server_name]
            result.append(dict_to_append)
        elif conn_disconn == 'dislinked':

            _dict[server_name].append((conn_disconn,date))
            del _dict[server_name]
print (result)


0 commentaires

0
votes

Essayez ceci:

data=[]
dff.seek(0)
for line in dff:
  try:
    date = re.search(r'\b^.*PM|\b^.*AM', line).group()
    server = re.search(r'\b(?:Server-\d[A-Z]|Server-1B)\b', line).group() 
    linked = re.search(r'\b(?:linked|dislinked)\b', line).group().split()[0]
  except:
    continue
  data.append({server: [(linked, date)]})

data
Out[2374]: 
#[{'Server-1A': [('linked', 'Jan 23 2016 10:30:08AM')]},
# {'Server-1B': [('linked', 'Jan 23 2016 11:04:56AM')]},
# {'Server-1B': [('dislinked', 'Jan 23 2016 1:18:32PM')]},
# {'Server-1A': [('dislinked', 'Jan 23 2016 9:43:44PM')]},
# {'Server-1A': [('linked', 'Feb 1 2016 12:40:28AM')]},
# {'Server-1A': [('dislinked', 'Mar 29 2016 1:13:07PM')]}#]


0 commentaires