首页 > 解决方案 > Python3:迭代数据,打印匹配字符串的所有键的值

问题描述

这里的超级新手,环顾四周没有运气,但它真的让我大吃一惊。

我想为与某个字符串匹配的所有键提取相应的值。

在这种情况下,我收到了来自 docker API 列表容器的 GET 请求。如图所示的两个容器,我想打印它们的“Id”和“Names”值。

同样出于好奇,我们将如何更深入地了解“PrivatePort”的价值?

干杯

[
    {
        "Id": "aa303658b81be27e932bfe4dad4fd3c12f0fb149963391a28657ca8a51549b80",
        "Names": [
            "/silly_chatterjee"
        ],
        "Image": "lgcon-base-steamcmd:latest",
        "ImageID": "sha256:3439f862bf7114f2a08ef684b7ebaa3b79cd0577906f473f9e04b1acb4071a27",
        "Command": "bash /steamcmd/steamcmd.sh",
        "Created": 1606578178,
        "Ports": [
            {
                "PrivatePort": 8080,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28015,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28016,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28082,
                "Type": "tcp"
            }
        ],
        "Labels": {},
        "State": "running",
        "Status": "Up 7 hours",
        "HostConfig": {
            "NetworkMode": "default"
        },
        "NetworkSettings": {
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "21d2b28c7ba993d9e056a2a43c8c5a048461fe820a3a861bd0b7720b101232ca",
                    "EndpointID": "01b60812abb596b22d51692caec97fb52ced498b5961c27aa9b3c67d6d71ea95",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        },
        "Mounts": []
    },
    {
        "Id": "93ffca099523727e2174e71bf0880e7b0edc3f7aa89279d37688f86061f237d5",
        "Names": [
            "/confident_wilbur"
        ],
        "Image": "lgcon-base-steamcmd:latest",
        "ImageID": "sha256:3439f862bf7114f2a08ef684b7ebaa3b79cd0577906f473f9e04b1acb4071a27",
        "Command": "bash /steamcmd/steamcmd.sh",
        "Created": 1606578168,
        "Ports": [
            {
                "PrivatePort": 28015,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28016,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28082,
                "Type": "tcp"
            },
            {
                "PrivatePort": 8080,
                "Type": "tcp"
            }
        ],
        "Labels": {},
        "State": "running",
        "Status": "Up 3 hours",
        "HostConfig": {
            "NetworkMode": "default"
        },
        "NetworkSettings": {
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "21d2b28c7ba993d9e056a2a43c8c5a048461fe820a3a861bd0b7720b101232ca",
                    "EndpointID": "802d3d63ce763999fc935b0ffcb77a394978e3608d4c7c3bb4f48664cde9bfb4",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        },
        "Mounts": []
    }
]

编辑:

以下返回'AttributeError:'list'对象没有属性'items'

import json

with open('test.json') as json_file:
    data = json.load(json_file)

def recursive_items(dictionary):
    for key, value in dictionary.items():
        if type(value) is dict:
            yield (key, value)
            yield from recursive_items(value)
        else:
            yield (key, value)



for key, value in recursive_items(data):
    print(key, value)

标签: pythonarrayspython-3.xloops

解决方案


也许这可以帮助你:

# turn json string into nested dictionaries 
data_nested_dicts = json.loads(data_json)

#iterate over containers
for container in data_nested_dicts:
    # get Id and Names
    container_id = container['Id']
    container_names = container['Names']

    # "collect" private ports
    container_private_ports = []
    for port in container['Ports']:
        container_private_ports.append(port['PrivatePort'])

    # print the data 
    print(container_id, container_names, container_private_ports)

输出:

aa303658b81be27e932bfe4dad4fd3c12f0fb149963391a28657ca8a51549b80 ['/silly_chatterjee'] [8080, 28015, 28016, 28082]
93ffca099523727e2174e71bf0880e7b0edc3f7aa89279d37688f86061f237d5 ['/confident_wilbur'] [28015, 28016, 28082, 8080]

推荐阅读