ValueError: нужно больше 1 значения для распаковки python

У меня есть существующее меню, которое дает вам варианты L или же D, L должен загрузить содержимое файла и D должен отобразить это.

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))

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

имя, взрослый, ребенок = line.split (',')
ValueError: для распаковки нужно более 1 значения

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

3 ответа

Решение

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

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

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

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

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

Когда вы назначаете три переменные слева, предполагается, что у вас есть три кортежа справа. В этом примере это выглядит line без запятой line.split(',') в результате получается список только с одной строкой, что приводит к ошибке "более 1 значения для распаковки".

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

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

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

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

Если вы хотите обойти это без добавления лишних строк и проверок, одно из решений - изменить разделение на следующее:

name, adult, child, garbage = (line+',,,').split(',', maxsplit=3)

Это будет молча игнорировать отсутствующие значения, а переменные будут пустыми. Это означает, что значения дляname, adult а также childбудут заполнены, если они есть, и будут пустыми, если их нет в исходном файле. В любом случае игнорируйте переменнуюgarbage.

Другие вопросы по тегам