read python data-structures dictionary yaml

read - Convertir archivo YAML a dict de Python



python yaml dump (2)

Tengo el siguiente problema de asignar documentos dentro de un archivo YAML a un dict y dict correctamente.

Tengo el siguiente archivo YAML, que representa un servidor ( db.yml ):

instanceId: i-aaaaaaaa environment:us-east serverId:someServer awsHostname:ip-someip serverName:somewebsite.com ipAddr:192.168.0.1 roles:[webserver,php]

Cargo este archivo YAML, que puedo hacer sin ningún problema, creo que lo entiendo.

instanceId = getInstanceId() stream = file(''db.yml'', ''r'') dict = yaml.load_all(stream) for key in dict: if key in dict == "instanceId": print key, dict[key]

Me gustaría que la lógica funcione como la siguiente:

  • cargar yaml, map to dict
  • busque en cada dictado del documento, si el instanceId coincide con el establecido por getInstanceId() , luego imprima todas las claves y valores de ese documento.

Si miro la estructura de datos del mapa desde la línea de comando, obtengo:

{''instanceId'': ''i-aaaaaaaa environment:us-east serverId:someServer awsHostname:ip-someip serverName:someserver ipAddr:192.168.0.1 roles:[webserver,php]''}

Creo que podría estar creando la estructura de datos para el archivo YAML de manera incorrecta, y al hacer coincidir el contenido del dict , estoy un poco perdido.

Nota al yaml.load() : no puedo cargar todos los documentos en este archivo usando yaml.load() , probé yaml.load_all() , que parece funcionar pero mi problema principal aún existe.


Creo que tu archivo yaml debería verse (o al menos algo así, así que está estructurado correctamente de todos modos):

instance: Id: i-aaaaaaaa environment: us-east serverId: someServer awsHostname: ip-someip serverName: somewebsite.com ipAddr: 192.168.0.1 roles: [webserver,php]

Entonces, yaml.load(...) devuelve:

{''instance'': {''environment'': ''us-east'', ''roles'': [''webserver'', ''php''], ''awsHostname'': ''ip-someip'', ''serverName'': ''somewebsite.com'', ''ipAddr'': ''192.168.0.1'', ''serverId'': ''someServer'', ''Id'': ''i-aaaaaaaa''}}

Y puedes ir desde allí ...

Tan usado como:

>>> for key, value in yaml.load(open(''test.txt''))[''instance''].iteritems(): print key, value environment us-east roles [''webserver'', ''php''] awsHostname ip-someip serverName somewebsite.com ipAddr 192.168.0.1 serverId someServer Id i-aaaaaaaa


Un error adicional en tu código, que no tiene que ver con YAML:

for key in dict: if key in dict == "instanceId": # This doesn''t do what you want print key, dict[key]

in es un operador que trabaja en tipos de secuencia , y también en mapas. Por eso no es un error de sintaxis ... pero no hace lo que quieres.

key in dict siempre se evaluará como True , porque todas las claves que está iterando están en el dict. Entonces, su código se reduce a True == "instanceId" , que siempre se evaluará como False , porque el valor booleano True nunca es igual a esa cadena.

Es posible que haya notado que la declaración de print no produce ningún resultado; Esto es porque nunca se llama.