Выравнивание данных в Python - PullRequest
0 голосов
/ 11 февраля 2019

Я новичок в Python.Я пишу код для создания файла Excel, содержащего данные, получаемые путем вызова API, и сопоставляю их, чтобы получить желаемый результат.

В основном беру данные из одной базы данных и выполняю поиск в других и извлекаю связанную информацию.

4 базы данных имеют следующие данные:

EEp
---------------------
{u'data': [{u'_id': u'5c30702c8ca9f51da8178df4',
            u'encap': u'vlan-24',
            u'ip': u'7.12.12.16',
            u'mac': u'5B:P9:01:9E:42:08'}]}

PathEp
-----------
{u'data': [{u'_id': u'5c54a81a8ca9f51da84ae08e',
            u'paths': u'paths-1507',
            u'endpoint': u'eth1/10',
            u'cep': u'5B:P9:01:9E:42:08',
            u'tenant': u'ESX'}]}
ip4_address
-----------------------

{u'data': [{u'Allocation': u'Build_Reserved',
            u'address': u'7.12.12.16',
            u'name': u'fecitrix-1',
            u'state': u'RESERVED'}]}
asset
---------------
{u'data': [{u'_id': u'57ccce8110dd54f02881fedc', 
            u'client': u'CES',
            u'hostname': u'fecitrix-1'
            u'os_team': u'Window'}]}

Логика:

  1. Если «mac» EEp и «cep» PathEp совпадаютчем взять "encap", "ip", "mac", "paths", "endpoint", "cep" и "tenant" (эти значения необходимо экспортировать в excel)

  2. Возьмите ip EEp и выполните поиск в «ip4_address» и получите «имя» из ip4_address (имя необходимо экспортировать в excel).

  3. Если «имя» ip4_address равно «hostname "из базы данных" asset ", затем возьмите" client "и" os_team "(экспортируйте в excel)

Я написал сценарий, но не получил желаемого результата.

def get_host_details(self):
    data = {
        "find": {
            "hostname": self.controller
            },
    "projection":{
        "tenant": 1,
        "paths": 1,
        "endpoint":1
        }
    }
    host_details = self.post("https://database.app.com/api/data/devices/PathEp/find", data)
    #print host_details
    hosts = []
    for record in host_details:
        if "mig" not in record["endpoint"]:
            hosts.append(record)
    return hosts


def get_ipaddress(self, controller):

    host_record = {"tenant": "UNKNOWN",
                   "paths": "UNKNOWN",
                   "endpoint": "UNKNOWN",
                   "ip": "UNKNOWN",
                   "mac": "UNKNOWN",
                   "encap": "UNKNOWN"}
    data = {
        "find": {
            "hostname": controller,
            "ip": {
                "$ne": "0.0.0.0"
            }
        },
        "projection": {
            "ip": 1,
            "mac":1,
            "encap":1,
        }
    }
    endpoints = self.post("https://database.app.com/api/data/devices/EEp/find", data)
    IPAM = self.get_dns()
    print endpoints
    host_details = self.get_host_details()
    host_details_record = []
    for record in endpoints:
        for host in host_details:
            if record["mac"] == host["cep"]:
                host_record = {"tenant": host["tenant"],
                               "paths": host["paths"],                                  
                               "endpoint": host["endpoint"],
                               "ip": record["ip"],
                               "mac": record["mac"],
                               "encap": record["encap"]}
                host_details_record.append(host_record)
    self.get_excel(host_details_record)


def get_dns(self, endpoints):
    ip_dns_record = []
    for each_endpoint in endpoints:
        data = {
            "find":
                {
                    "address": {
                        "$eq": each_endpoint["ip"]
                    },
                },
            "projection":
                {
                    "name": 1
                }

        }

        dns_record = {"client":"UNKNOWN",
                      "os_team":"UNKNOWN",


        ipam_record = self.post("https://database.app.com/api/data/"
                                "internal/ip4_address/find", data)
        if ipam_record:
            dns_record["ip_address"] = each_endpoint["ip"]
            dns_record["hostname"] = ipam_record[0]["name"]
            dns_record = self.get_remedy_details(ipam_record[0]["name"],
                                                 dns_record)
            ip_dns_record.append(dns_record)
        else:
            dns_record["ip_address"] = each_endpoint["ip"]
            dns_record["hostname"] = "UNKNOWN"
            ip_dns_record.append(dns_record)
    self.get_excel(ip_dns_record)



def get_remedy_details(self, hostname, dns_record):

    data = {
        "find":
            {
                "hostname": hostname.upper(),

            }
    }
    remedy_data = self.post("https://database.app.com/api/data/internal/asset/find", data)
    print(remedy_data)
    #remedy_data = remedy_data["data"]
    if remedy_data:
        dns_record["client"] = remedy_data[0].get("client","UNKNOWN")
        dns_record["os_team"] = remedy_data[0].get("os_team", "UNKNOWN")

    else:
        dns_record["client"] = "UNKNOWN"
        dns_record["os_team"] = "UNKNOWN"

    return dns_record

def get_excel(self, ip_dns_record):
    filename = self.controller + ".xls"
    excel_file = xlwt.Workbook()
    sheet = excel_file.add_sheet('HOSTLIST')
    sheet.write(0, 0, "IP Address")
    sheet.write(0, 1, "HostName")
    sheet.write(0, 2, "Client")
    sheet.write(0, 3, "OS Team")

    for count in xrange(1, len(ip_dns_record)+1):
        sheet.write(count, 0,ip_dns_record[count - 1]["ip_address"])
        sheet.write(count, 1,ip_dns_record[count - 1]["hostname"])
        sheet.write(count, 2,ip_dns_record[count - 1]["client"])
        sheet.write(count, 3,ip_dns_record[count - 1]["os_team"])

    excel_file.save(filename)
if __name__ == "__main__":
    controller = sys.argv[1]
    OBJ = ACIHostList(controller)
    print "SCRIPT COMPLETED"

Не знаю, где я иду не так и что нужно сделать.

1 Ответ

0 голосов
/ 12 февраля 2019

Ваш вопрос опущен слишком много.Вы должны включить все ошибки, которые вы получаете.Вы также должны прокомментировать свой код, чтобы мы могли понять, чего вы пытаетесь достичь на каждом этапе.

Это не ответ, а попытка:

Вместо того, чтобы пытаться свернутьОбойдите модуль как Excel, запишите свои данные в простой файл CSV.CSV-файл можно открыть в Excel, и он правильно форматируется, но его гораздо проще создать.

import csv

data = [["a", "b"], ["c", "d"]]
with open("file.csv", "w+") as csv_file:
    create_csv = csv.writer(csv_file)
    create_csv .writerows(data)

просто захватите все ваши данные в 2D-список и с помощью приведенного выше кода поместите его в файл, чтобыВы можете легко прочитать это.проверьте вывод файла и посмотрите, получаете ли вы ожидаемые данные.

Если вы не получаете нужные данные в этот CSV-файл, значит, есть проблема с запросами к вашей базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...