拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何使用Python从JSONAPI中选择、映射和统计资料?

如何使用Python从JSONAPI中选择、映射和统计资料?

白鹭 - 2022-01-26 2143 0 0

我是 Python 新手,正在努力为以下问题找到正确的方法:

我有 2 个 API 回应,一个是设备串列,另一个是组织串列。每台设备都通过一个组织 ID 链接到一个组织。

organizations = [
                 {
                  'name': 'Aperture Science Inc.', 
                  'description': 'Just a corporation!', 
                  'id': 1
                 }, 
                 {
                  'name': 'Software Development Inc', 
                  'description': "Making the world's next best app!", 
                  'id': 2
                 }
                ]

devices = [
           {
            'id': 1, 
            'organizationId': 2, 
            'nodeClass': 'WINDOWS_WORKSTATION', 
            'displayName': 'DESKTOP_01'
            },{
            'id': 2, 
            'organizationId': 2, 
            'nodeClass': 'WINDOWS_SERVER', 
            'displayName': 'SERVER_01'
            },{
            'id': 3, 
            'organizationId': 1, 
            'nodeClass': 'WINDOWS_WORSTATION', 
            'displayName': 'DESKTOP_0123'
            }
           ]

设备中的 OrganizationID = 组织中的 ID。我想分别获得每个组织的服务器和作业站数量的结果,如下所示:

results = [
           { 
            'Organization Name' : 'Aperture Science Inc.', 
            'Number of Workstations': 1, 
            'Number of Servers': 0,
            'Total devices': 1
           }, 
           { 
            'Organization Name' : 'Software Development Inc', 
            'Number of Workstations': 1, 
            'Number of Servers': 1,
            'Total devices': 2
           }

我从这个开始

wks_sum = sum(d.nodeClass == "WINDOWS_WORKSTATION" for d in devices)
print(wks_sum)

但我收到此错误:

最后我转换并保存在一个 csv 档案中:

df = pd.DataFrame(results)
df.to_csv('results.csv', index=False)

我正在努力计算每种设备型别并将设备映射到正确的组织名称,非常感谢一些帮助:)

编辑:

感谢@Vincent,我可以想出:

    for device in devices:
    for organization in organizations:
        organization["workstations"] = organization.get("workstations", [])
        organization["servers"] = organization.get("servers", [])
        if device["organizationId"] != organization["id"]:
            continue
        if device["nodeClass"].__eq__("WINDOWS_SERVER"):
            organization["servers"].append(device["nodeClass"])
        elif device["nodeClass"].__eq__("WINDOWS_WORKSTATION"):
            organization["workstations"].append(device["nodeClass"])
        break

results = [
    {
        "Organization Name": organization["name"],
        "Number of Workstations": len(organization["workstations"]),
        "Number of Servers": len(organization["servers"]),
        "Total devices": len(organization["workstations"]   organization["servers"]),
    } for organization in organizations
]


# print(f"{results = }")
print(results)


# convert and save in a csv file

df = pd.DataFrame(results)
df.to_csv('results.csv', index=False)

uj5u.com热心网友回复:

此代码将实作您的目标:

organizations = [
     {
      'name': 'Aperture Science Inc.', 
      'description': 'Just a corporation!', 
      'id': 1
     }, 
     {
      'name': 'Software Development Inc', 
      'description': "Making the world's next best app!", 
      'id': 2
     }
]

devices = [
    {
    'id': 1, 
    'organizationId': 2, 
    'nodeClass': 'WINDOWS_WORKSTATION', 
    'displayName': 'DESKTOP_01'
    },{
    'id': 2, 
    'organizationId': 2, 
    'nodeClass': 'WINDOWS_SERVER', 
    'displayName': 'SERVER_01'
    },{
    'id': 3, 
    'organizationId': 1, 
    'nodeClass': 'WINDOWS_WORSTATION', 
    'displayName': 'DESKTOP_0123'
    }
]

for device in devices:
    for organization in organizations:
        organization["workstations"] = organization.get("workstations", [])
        organization["servers"] = organization.get("servers", [])
        if device["organizationId"] != organization["id"]:
            continue
        if device["displayName"].startswith("SERVER_"):
            organization["servers"].append(device["nodeClass"])
        elif device["displayName"].startswith("DESKTOP_"):
            organization["workstations"].append(device["nodeClass"])
        break
        
results = [
    {
        "Organization Name": organization["name"],
        "Number of Workstations": len(organization["workstations"]),
        "Number of Servers": len(organization["servers"]),
        "Total devices": len(organization["workstations"]   organization["servers"]),
    } for organization in organizations
]


print(f"{results = }")

结果:

[{'Organization Name': 'Aperture Science Inc.', 'Number of Workstations': 1, 'Number of Servers': 0, 'Total devices': 1}, {'Organization Name': 'Software Development Inc', 'Number of Workstations': 1, 'Number of Servers': 1, 'Total devices': 2}]

确实,您可以使用诸如 Pandas 之类的晦涩库来完成,但我认为像这样的慢速代码更好地了解已完成的操作,并且在需要时更易于修改。

处理海量资料,例如使用sqlite3转储到两个sql表中,然后处理SQL。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *