Найти - Пользователи
Полная версия: ValueError: too many values to unpack (expected 2)
Начало » Python для новичков » ValueError: too many values to unpack (expected 2)
1
seriy_volk
Друзья,
Занимаюсь по книге Доусона “Программируем на Python”. Запнулся на 7 главе, задание 3 (сохранение рекордов в текстовом файле). Не могу вывести таблицу рекордов пользователю. Подскажите пожалуйста, в чем может быть проблема.

Traceback (most recent call last):
_challenge.py“, line 126, in <module>
main()
_challenge.py”, line 90, in main
welcome(title)
_challenge.py“, line 62, in welcome
display_highscores()
_challenge.py”, line 74, in display_highscores
score, name = line
ValueError: too many values to unpack (expected 2)

Функции:
# добавляем запись в таблицу рекордов
def add_highscore(name, score):
    highscore_file = open_file("highscore.txt", "a")
    entry = (score, name)
    highscore_file.writelines(str(entry))
    highscore_file.close()

# выводим таблицу рекордов
def display_highscores():
    highscore_file = open_file("highscore.txt", "r")
    print("Таблица рекордов\n")
    print("Имя\tОчки")
    for line in highscore_file:
        score, name = line
        print(name, "\t", score)
    highscore_file.close()
alex925
У тебя line это одна строка из файла, она присваивается переменной score, а переменной name ты ничего не присваиваешь, хотя указал, что будешь. Отсюда и ошибка.
seriy_volk
Почему тогда тут работает? (из примеров к книге)
scores = []
# display high-score table
    elif choice == "1":
        print("High Scores\n")
        print("NAME\tSCORE")
        for entry in scores:
            score, name = entry
            print(name, "\t", score)
alex925
Потому что видимо scores хранит набор последовательностей (кортежи, спики), которые распаковываются и присваиваются 2 твоим переменным.

Вот пример:
а ссылается на последовательность (кортеж), если мы используем множественное присваивание, то он автоматически распаковывается и значения присваиваются переменным.
>>> a = ('1', '2', '3')
>>> x, y, z = a
>>> x
'1'
>>> y
'2'
>>> z
'3'
seriy_volk
Ничего более умного, чем сделать без кортежей не придумал. Но так или иначе оно работает. Хотел еще опционально сортировку таблицы рекордов запилить, но она косячит. Может есть какие рекомендации?
def display_highscore():
    highscore_file = open_file("highscore.txt", "r")
    print("Таблица рекордов\n")
    print("Очки\tИмя")
    highscore = highscore_file.read()
    print(highscore)
    highscore_file.close()
def add_highscore(name, score):
    highscore_file = open_file("highscore.txt", "a")
    entry = (score, "\t", name, "\n")
    highscore_file.writelines(entry)
    highscore_file.close()
def sort_highscore():
    lines = []
    # sort this highscores
    highscore_file = open_file("highscore.txt", "r")
    for line in highscore_file:
        lines.append(line)
    lines.sort(reverse=True)
    highscore_file.close()
    # write sorted highscores
    highscore_file = open_file("highscore.txt", "w")
    for line in lines:
        highscore_file.write(line)
    highscore_file.close()
alex925
seriy_volk
Покажи содержимое фала highscore
seriy_volk
alex925
seriy_volkПокажи содержимое фала highscore
500	R
500	D
300	E
1100	Boom
100	T
100	D
0	D

1100 Boom отсортировался неверно
alex925
seriy_volk
Может есть какие рекомендации
Да есть, не надо изобретать велосипеды, если чуть поменять функцию display_highscores, то все будет работать. Вот, держи:
def display_highscores():
    highscore_file = open_file("highscore.txt", "r")
    print("Таблица рекордов\n")
    print("Имя\tОчки")
    for line in highscore_file.strip():
        score, name = line.split(' ')
        print(name, "\t", score)
    highscore_file.close()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB