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 porgetInstanceId()
, 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.