python, iteración del generador con uno o más elementos

Estoy usando pyyaml ​​y estoy cargando un archivo.yml

stream = open("file.yml", "r")
results = yaml.load_all(stream)

resultados ahora contiene un objeto generador.

Entonces, estoy tratando de procesar esto:

for key, value in results:
    print(key, "->", value)

si tengo más de un "elemento yaml" en mi archivo.yml, esto funciona bien. ejemplo:

foo: bar

Hola Mundo

pero, si tengo un solo "elemento yaml" en mi archivo.yml, esto no funciona. ejemplo:

foo: bar

el error es: ValueError: need more than 1 value to unpack

estoy usando python 3

¿Como puedo resolver esto? el archivo.yml puede contener 1 o más elementos.

preguntado el 21 de septiembre de 13 a las 12:09

2 Respuestas

results es una lista de diccionarios, por lo que en lugar de iterar sobre eso, desea iterar sobre los diccionarios:

for dictionary in results:
    for key, value in dictionary.items():
        print(key, "->", value)

Entonces, estaba tratando de asignar la clave a un diccionario y el valor a otro, porque estaba desempaquetando de la lista y no del diccionario. dict.items() devuelve una lista de tuplas con la clave en la primera posición y el valor en la otra de la tupla.

Respondido el 21 de Septiembre de 13 a las 12:09

¿por qué? siempre tengo un diccionario :S - fj123x

@ fj123x Entonces, ¿por qué se generaría ValueError? - terrya

no sé, vea el ejemplo file.yml, siempre pongo key: value data en mi yml, pero cuando el generador solo tiene 1 elemento, el ValueError está aumentando (esto no ocurre cuando tiene más de 1 elemento) - fj123x

@ fj123x Eso no parece correcto. Hacer print(list(results)). ¿Qué aparece? - terrya

[{'foo': {'bar': 'test', 'hello': 'world'}}] esto es un dict foo: {...} - fj123x

results = yaml.load_all(stream)
for doc in results:
    for k, v in doc.items():
        print(k, "->", v)

respondido 26 mar '15, 13:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.