2012-04-30 3 views
7

У меня есть существующее меню, которое дает вам варианты L или D. L должен загружать содержимое файла, и D должен отображать его.ValueError: требуется больше, чем 1 значение для распаковки 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)) 

Однако, когда я пытаюсь запустить это я получаю сообщение об ошибке:

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

Почему я получаю эту ошибку?

+1

FYI: Вы также можете сказать 'option.upper() == 'L'' и сделать ваш код немного легче читать и поддерживать/обновлять. – bossylobster

+0

хорошая идея. спасибо – EatMyApples

ответ

12

Это означает, что есть строка в packages.txt, которая, когда вы разделяете пробелы и разделяете запятыми, не дает ровно трех частей. На самом деле кажется, что он дает только 1 часть («нужно больше, чем 1 значение для распаковки»), что предполагает, что есть строка без запятых.

Возможно, есть пробелы или строки комментариев в packages.txt?

Возможно, вам понадобится ваш код для более разумного анализа синтаксического анализа файла.

+0

Хорошо, что сработало, но теперь для печати ((имя), "-", (для взрослых), "/", (child)), это говорит о том, что переменная "name" не определена? – EatMyApples

+0

Почему вы ожидаете, что там будет определено имя? Он устанавливается только при выборе опции «L». Вы сделали L до D, который заставляет использовать второй блок? –

3

Эта ошибка происходит в

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

При назначении трех переменных на левой его если у вас есть 3-кортеж справа. В этом примере, как представляется, line не имеет запятой, поэтому line.split(',') приводит к списку с одной строкой, поэтому ошибка «больше, чем значение для распаковки».

+0

Итак, что вы предлагаете мне делать? – EatMyApples

+0

Разделить на случаи, которые определяют значение 'line.split (',')', в частности длину вывода. Если вы предположите, что файл также будет иметь три элемента, вам нужно выяснить, почему эта строка не работает. – bossylobster

+0

Я исправил его, но теперь для печати ((имя), «-», (для взрослых), «/», (ребенок)), он говорит, что переменная «имя» не определена? – EatMyApples

2

line.split(',') возвращает кортеж. Затем вы снимите пакет, что кортеж написав:

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

Если кортеж не имеет ровно три элемента, то не-упаковки не удается. В вашем случае сообщение об ошибке указывает, что у вас есть только один элемент. Таким образом, line.split(',') явно возвращает кортеж только с одним элементом. И это означает, что line не имеет запятых.

Возможно, это означает, что ваши входные данные не то, что вы ожидаете от этого. Вы требуете, чтобы line - это строка, содержащая три значения, разделенные запятыми, но в ваших входных данных есть строка, которая не соответствует этому требованию.

+0

Меньше или более трех элементов. Вы связаны ровно с тремя элементами. – bossylobster

+0

Есть ли способ исправить это? – EatMyApples

+1

Ну, вам нужно разобраться, почему это происходит. Мы не можем знать, почему. Все, что мы можем сделать, это сказать вам, что ваши исходные данные не то, что вы ожидаете. –

Смежные вопросы