Search code examples
pythonlistdictionarykeyerror

Key error while appending the details to dictionary


I have test log like below. Trying to read it in better way. Got key error while adding elements to the dictionary. while checking the if condition there is no output is generated and while doing elif got key error

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

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)

Expected out

[{'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']}]


Solution

  • When you are checking if conn_disconn == 'linked': , conn_disconn has linked\n so it is not adding to dictionary and you are getting the key error.

    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)
    

    Output:

    [{'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')]}]