2012-04-30 12 views
7

Tengo un menú existente que le da las opciones L o D. L debería cargar el contenido de un archivo y D debería mostrarlo.ValueError: necesita más de 1 valor para descomprimir python

if option == "l" or option == "L": 
    with open("packages.txt") as infp: 
     for line in infp: 
     line = line.rstrip() 
     name,adult,child= line.split(',') 

if option == "d" or option == "D": 
    print ((name)," - ",(adult),"/",(child)) 

Sin embargo, cuando trato de ejecutar este me sale el error:

name,adult,child= line.split(',')
ValueError: need more than 1 value to unpack

¿Por qué obtengo este error?

+1

FYI: También podría decir 'option.upper() == 'L'' y hacer que su código sea un poco más fácil de leer y mantener/actualizar. – bossylobster

+0

buena idea. gracias – EatMyApples

Respuesta

12

Esto significa que hay una línea en packages.txt que, cuando se tira del espacio en blanco y se divide en comas, no da exactamente tres piezas. De hecho, parece que solo da 1 pieza ("necesita más de 1 valor para descomprimir"), lo que sugiere que hay una línea sin comas.

¿Quizás hay líneas en blanco o comentarios en packages.txt?

Es posible que necesite su código para ser más inteligente sobre el análisis del contenido del archivo.

+0

Ok, eso funcionó, pero ahora para imprimir ((nombre), "-", (adulto), "/", (niño)) lo dice diciendo que la variable "nombre" no está definida? – EatMyApples

+0

¿Por qué esperarías que se definiera 'name' allí? Solo se establece cuando se toma la opción 'L'. ¿Has hecho una L antes de la D que hace que se use ese segundo bloque? –

3

Este error se produce en

name,adult,child= line.split(',') 

Cuando asigna tres variables de la izquierda se Asumiendo que tiene un 3-tupla a la derecha. En este ejemplo, aparece line no tiene coma, por lo tanto line.split(',') resultados en una lista con una sola cadena, por lo tanto el error "más de valor para descomprimir".

+0

Entonces, ¿qué sugieres que debería hacer? – EatMyApples

+0

Dividir en casos que condicionan el valor de 'line.split (',')', particularmente la longitud de la salida. Si asume que el archivo también tendrá tres elementos, necesita averiguar por qué esta línea no lo hace. – bossylobster

+0

lo arreglé, pero ahora para imprimir ((nombre), "-", (adulto), "/", (niño)) ¿Lo dice diciendo que la variable "nombre" no está definida? – EatMyApples

2

line.split(',') devuelve una tupla. A continuación, un-paquete que tupla escribiendo:

name,adult,child= line.split(',') 

Si la tupla no tiene exactamente tres elementos, entonces falla la ONU-embalaje. En su caso, el mensaje de error indica que solo tiene un elemento. Entonces, line.split(',') está devolviendo claramente una tupla con solo un elemento. Y eso significa que line no tiene comas.

Probablemente esto signifique que sus datos de entrada no son los que espera. Necesita que line sea una cadena que contenga tres valores separados por comas, pero hay una línea en sus datos de entrada que no cumple con ese requisito.

+0

Menos o más de tres elementos. Estás obligado a exactamente tres elementos aquí. – bossylobster

+0

¿Hay alguna manera de arreglar eso? – EatMyApples

+1

Bueno, tienes que averiguar por qué sucede esto. No podemos saber por qué. Todo lo que podemos hacer es decirte que tus datos de entrada no son lo que esperas que sean. –

Cuestiones relacionadas