Разбор словаря в Python для моей текущей таблицы - PullRequest
0 голосов
/ 08 октября 2019

У меня есть таблица, которая содержит несколько категорий, и две из них: MAC-адрес и имя устройства. У меня был список моего mac-адреса, записанный в моем коде (жестко закодированный) с соответствующими им именами устройств (т.е. deviceDict['00:00:00:00:00:00']= name)

Теперь я передал эти mac-адреса и имена устройств в текстовый файл для чтенияиз того же самого кода Python и проанализировать его на моей таблице. Код в настоящее время распознает текстовый файл, но не анализирует эту информацию в таблице.

Вот код:

# File: WapLogParser.py
# Desc: Parses a WAP log file and pulls out information relating to connected clients
# Usage: python WapLogParser.py [file glob]

import re
import sys
import glob
import os

deviceDict = dict()

# Base table for storing client info
# All names must match what is in the Wap Log file
#   Exceptions: Date, Wap Name, Device Name - which are provided outside of the result parsing
table = [["Ssid", "Vlan", "Mac Address", "Connected Time", "Ip Address", "Rssi", "Date", "Wap Name", "Device Name"]]

def ParseResult(result, date, wapName):
    lines = result.split('\n')
    lines = list(filter(None, lines))
    # Any useful info will be at least 2 lines long
    if len(lines) == 1:
        return
    # create empty row
    data = [""] * len(table[0])
    # for each item in the result place it in the correct spot in the row 
    for line in lines:
        if line != "":
            # Parse the key/value pair
            m = re.match(r"(.*):\s\.*\s?(.*)", line)
            if m is not None:
                for idx in range(len(table[0])):
                    if table[0][idx].lower() == m[1].lower():
                         data[idx] = m[2]
        else:
            break

    # Remove the '(dBm)' from the RSSI value
    data[5] = data[5].split()[0]

    # Append WAP specific items to row
    data[6] = date
    data[7] = wapName
    data[8] = GetDeviceName(data[2].upper())

    # Add row to table
    table.append(data)


def ParseFile(path):
    with open(path) as f:
        lines = f.readlines()
        result = ""
        command = ""
        date = ""
        # WAP name is always on the first line 16 characters in with 4 
        # unnecessary characters trailing
        wapName = lines[0].strip()[16:-4]
        for line in lines:
            line = line.strip()
            # Is an issued command?
            if line.startswith("/#"):
                if command != "":
                    ParseResult(result, date, wapName) 
                command = "" 
                # reset the result for the new command
                result = ""
                m = re.match(r"^/#.*show\sclient.*stats$", line)
                if m is not None:
                    command = line
            # Anything that is not a command add to the result
            else:
                result += line + "\n"

            # Do we have the date?
            if line.startswith("Current date:"):
                date = line.replace("Current date: ", "")

# Print output to stderr
def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

# Print a 2d array in a csv format
def PrintAsCsv(table):
    for row in table:
        print(",".join(row))


def Main():
    InitDeviceDict()
    numArgs = len(sys.argv)
    for filename in glob.iglob(sys.argv[numArgs - 1], recursive=True):
        # Globs get directories too
        if os.path.isfile(filename):
            eprint("Parsing " + filename)
            try:
                ParseFile(filename)
            except Exception as e: # Mainly for if we see a binary file
                eprint("Bad file: " + e)

    # Print in a format we can use
    PrintAsCsv(table)


def GetDeviceName(macAddress):
    if macAddress in deviceDict:
        return deviceDict[macAddress]

    manufacturerPart = macAddress[:8]
    if manufacturerPart in deviceDict:
        return deviceDict[manufacturerPart]

    return 'Unknown Device'


def InitDeviceDict():
    with open('try.txt','r') as fo:
        for line in fo:
           deviceDict = {}
           line = line.split(',')
           macAddress = line[0].strip()
           manufacturerPart = line[1].strip()
           if macAddress in deviceDict:
               deviceDict[macAddress].append(manufacturerPart)
           else:
               deviceDict[macAddress]=(manufacturerPart)


           print(deviceDict)

# entry point
# script arguments:
#   WapLogParser.py [file glob]
if __name__ == "__main__":
    Main()

Проблема связана с функциями GetDeviceName и InitDeviceDict. Когда я запускаю код, а затем пакетный файл для отображения моей информации в Excel, я продолжаю получать «неизвестное устройство» (как будто оно не распознает MAC-адрес, который я ввел для создания имени устройства)

Любой способЯ могу это исправить? Спасибо

1 Ответ

1 голос
/ 08 октября 2019

deviceDict, который заполняется в InitDeviceDict, не является глобальным deviceDict. Вы изменяете только локальный словарь функций (и сбрасываете его также в каждой строке). Удалите deviceDict = {} из этой функции и в верхней части функции используйте global deviceDict, чтобы объявить, что вы изменяете глобальное значение.

def InitDeviceDict():
    global deviceDict
    with open('try.txt','r') as fo:
        for line in fo:
           line = line.split(',')
           macAddress = line[0].strip()
           manufacturerPart = line[1].strip()
           if macAddress in deviceDict:
               deviceDict[macAddress].append(manufacturerPart)
           else:
               deviceDict[macAddress]=[manufacturerPart]
...