Я пытаюсь получить сетевые интерфейсы, созданные в EC2, и из-за этого я использую функцию «describe_network_interfaces» из boto3. Вывод этой функции представляет собой структуру, подобную этой:
{
'NetworkInterfaces': [
{
'Association': {
'AllocationId': 'string',
'AssociationId': 'string',
'IpOwnerId': 'string',
'PublicDnsName': 'string',
'PublicIp': 'string',
'CustomerOwnedIp': 'string',
'CarrierIp': 'string'
},
'Attachment': {
'AttachTime': datetime(2015, 1, 1),
'AttachmentId': 'string',
'DeleteOnTermination': True|False,
'DeviceIndex': 123,
'NetworkCardIndex': 123,
'InstanceId': 'string',
'InstanceOwnerId': 'string',
'Status': 'attaching'|'attached'|'detaching'|'detached',
'EnaSrdSpecification': {
'EnaSrdEnabled': True|False,
'EnaSrdUdpSpecification': {
'EnaSrdUdpEnabled': True|False
}
}
},
'AvailabilityZone': 'string',
'Description': 'string',
'Groups': [
{
'GroupName': 'string',
'GroupId': 'string'
},
],
'InterfaceType': 'interface'|'natGateway'|'efa'|'trunk'|'load_balancer'|'network_load_balancer'|'vpc_endpoint'|'branch'|'transit_gateway'|'lambda'|'quicksight'|'global_accelerator_managed'|'api_gateway_managed'|'gateway_load_balancer'|'gateway_load_balancer_endpoint'|'iot_rules_managed'|'aws_codestar_connections_managed',
'Ipv6Addresses': [
{
'Ipv6Address': 'string'
},
],
'MacAddress': 'string',
'NetworkInterfaceId': 'string',
'OutpostArn': 'string',
'OwnerId': 'string',
'PrivateDnsName': 'string',
'PrivateIpAddress': 'string',
'PrivateIpAddresses': [
{
'Association': {
'AllocationId': 'string',
'AssociationId': 'string',
'IpOwnerId': 'string',
'PublicDnsName': 'string',
'PublicIp': 'string',
'CustomerOwnedIp': 'string',
'CarrierIp': 'string'
},
'Primary': True|False,
'PrivateDnsName': 'string',
'PrivateIpAddress': 'string'
},
],
'Ipv4Prefixes': [
{
'Ipv4Prefix': 'string'
},
],
'Ipv6Prefixes': [
{
'Ipv6Prefix': 'string'
},
],
'RequesterId': 'string',
'RequesterManaged': True|False,
'SourceDestCheck': True|False,
'Status': 'available'|'associated'|'attaching'|'in-use'|'detaching',
'SubnetId': 'string',
'TagSet': [
{
'Key': 'string',
'Value': 'string'
},
],
'VpcId': 'string',
'DenyAllIgwTraffic': True|False,
'Ipv6Native': True|False,
'Ipv6Address': 'string'
},
],
'NextToken': 'string'
}
Как я могу получить только значение из «NetworkInterfaceId» и поместить его в список? Я пытался извлечь это значение с помощью регулярного выражения, но у меня пока нет больших навыков в этом. Не могли бы вы, ребята, помочь мне, пожалуйста?
Вы знаете, как работают дикторы? mydict["Сетевые интерфейсы"]...
@ Alex_X1 данные не совсем правильный словарь
Если бы данные были действительным словарем, вы могли бы сделать print([x["NetworkInterfaceId"] for x in data["NetworkInterfaces"]])
@JonSG да, это правда, но в заголовке он ссылается на диктовку, так что я думаю, что это действительная диктовка
Mydict['NetworkInterfaces'][0]['NetworkInterfaceId']
А когда у меня более 1 NetworkInterfaceId? Эта структура может дублироваться, понимаете?
Чтобы получить значение из словаря, вам нужно «перейти» к нему. Например:
my_network_interface_id = my_dict["NetworkInterfaces"][0]["NetworkInterfaceId"]
Нам нужен 0, чтобы получить первый элемент массива. Вы также можете взглянуть на ответ @JonSG.
А когда у меня более 1 NetworkInterfaceId? Эта структура может дублироваться, понимаете?
Если есть несколько значений, он должен получить список из словаря или набор, я не совсем уверен
Если для my_dict заданы предоставленные данные, это приведет к ошибке, поскольку предоставленные данные не приводят к правильному диктованию. TypeError: unsupported operand type(s) for |: 'str' and 'str'
Я знаю, и я заметил, что это может быть ошибка автора, мой ответ должен работать в случае, если дикт действителен
Конечно вещь. Поскольку ОП хочет «список», вы можете добавить понимание списка, которое я указал в комментариях выше.
Какой работал? Мои или @JonSG
Ваш код, Алекс
Я рад, что смог помочь, если вы довольны моим ответом, обязательно примите его.
Вы можете использовать сокращение для этого
network_interfaces = [interface["NetworkInterfaceId"] for interface in response["NetworkInterfaces"]]
Что ты уже испробовал?