python - 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)
解决方案
也许这可以帮助你:
# 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]
推荐阅读
- frama-c - 验证没有无符号整数环绕
- javascript - 根据网站中的值打开 Chrome 选项卡
- eclipse - Spark RDD:AggregateByKey 抛出不可序列化的任务,我看不到不可序列化的对象
- javascript - 在 reactJS 中将类组件转换为功能组件
- spring - 微服务数据库架构
- python - 为什么这个节目时间不对?
- php - 使用 Laravel Medialibrary 测试 S3 上传“当前请求在名为的键中没有文件”
- python - 在 kubernetes 中自动重启子 python 进程
- java - java Maven Spring Boot UnsatisfiedLinkError when spring-boot:在项目中复制自己的库运行
- node.js - Nodejs 刷新时创建多个池