Python: «ValueError: слишком много значений для распаковки (ожидается 2)» для системы паролей с именем пользователя

Я получаю эту ошибку «ValueError: слишком много значений для распаковки (ожидается 2)», когда я создаю словарь из текстового файла, когда в текстовом файле более 1 ключа и значения.

database = {}  #creates an empty dictionary
with open("file.txt", "r") as infile:  #opens the dictionary
    for line in infile: #for each line
        name, ask = line.strip().split(':') 
        database[name] = (ask)


name = input('Enter username: ')
ask = input('Enter pin: ')
if name in database:
    if ask in database[name]:
        print('Welcome', name)

    else:
        database.update( {name : ask} )
        print(database)
else:
    database.update( {name : ask} )
    print(database)


with open('file.txt', 'w') as file: 
    file.write(json.dumps(database)) #updates the text file with the new databse

Я ожидаю, когда программа запустится и в текстовом файле будет более 1 ключа и значения для запуска независимо от того, какой ключ вводится. Однако, если в файле более 1 ключа/значения, текстовый файл не может быть распакован.

Можете ли вы привести пример строки из «file.txt»?

francisco sollima 28.05.2019 17:24

Вот что сейчас находится в текстовом файле, что вызывает ошибку: {"name" : "hello", "man" : "mane"}

jaggers 28.05.2019 17:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 662
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Используя функцию pythons eval, вы можете разобрать строку, прочитанную из файла, в словарь. Затем вы можете записать это в свой словарь

with open("file.txt", "r") as infile:  #opens the dictionary
    for line in infile: #for each line
        entry = eval(line)
        database[entry["name"]] = entry["man"]

С этим: я попытался ввести ключ: «имя» для имени пользователя и значение: «привет» для PIN-кода. Это привело к выводу: {'hello': 'mane', 'name': 'hello'} и изменило содержимое текстового файла на: {"hello": "mane", "name": "hello"}

jaggers 28.05.2019 18:02

Попробуй это,

import ast

with open("file.txt", "r") as infile:  #opens the dictionary
    for line in infile: #for each line
        eval_dict = ast.literal_eval(line) # This gives you a dictionary
        database[name] = eval_dict["name"]

Примечание:

Согласно комментарию @jaggers,

Я рассмотрел {"name" : "hello", "man" : "mane"} строку в текстовом файле.

это возвращает ошибку: NameError: имя «имя» не определено. Это для строки: база данных[имя] = eval_dict["имя"]

jaggers 28.05.2019 17:56

@jaggers, вы упомянули пример текстовой строки, присутствующей в файле в комментариях к вопросу. Я использовал то же самое для создания программы. Что такое текст в вашем текстовом файле?

shaik moeed 28.05.2019 18:00

содержимое текстового файла: {"name" : "hello", "man" : "mane"} однако мне нужно, чтобы код работал независимо от того, что находится в текстовом файле, так как это может быть изменено пользователями. изменить свои данные, пользователи могут удалить свою учетную запись или новые пользователи могут быть добавлены в словарь

jaggers 28.05.2019 18:04

@jaggers Независимо от того, удаляются или добавляются данные. Свойство словаря - ключи должны быть уникальными. значения могут быть обновлены. Если вам нужно поддерживать словарь пользователей, я могу вам предложить создать id's как ключи и поддерживать словарь как значение этого ключа.

shaik moeed 28.05.2019 18:10

Это будет полностью выходить за рамки этого вопроса. users_dict = {'1':{'name':'hello1', 'man':'mane1'}, '2':{'name':'hello2', 'man':'mane2'}. Вы можете рассматривать это как что-то похожее на пример, как я сказал.

shaik moeed 28.05.2019 18:19

Проверьте все строки в файле файл.txt. Может быть случай, когда вхождение ":" более одного. Так как вы распаковываете список в две переменные. Если в результирующем списке в строке 4 содержится более двух значений, то есть line.strip().split(":"), будет возбуждено исключение.

содержимое файла: {"имя" : "привет", "мужчина" : "грива"}

jaggers 28.05.2019 18:03

Содержимое файла выглядит как данные JSON. Вы можете использовать функцию load() модуля json для загрузки данных в виде словаря. Также убедитесь, что ключи в файле уникальны.

Vishal 28.05.2019 18:18

будет ли это просто загрузка (file.txt)

jaggers 28.05.2019 18:22

Для функции load() требуется файловый объект для чтения. Вы можете обратиться к этому документу realpython.com/python-json для получения дополнительной информации.

Vishal 28.05.2019 18:28

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

 {"name" : "hello", "man" : "mane"}

Это не может быть проанализировано в вашем коде.

Если ваш файл был вместо этой формы:

"name":"hello"
"man":"mane"

(новая строка неявна), тогда все будет работать нормально.

Ошибка, по-видимому, заключается в том, что вы думаете, что текстовый файл, который выглядит как словарь Python, будет автоматически проанализирован Python как словарь: это не так, поэтому у вас есть другие ответы, которые предлагают использовать eval() или похоже на разбор его для вас.

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

чт

о, я понимаю, что вы имеете в виду. Знаете ли вы, как заставить код создавать текст в файле в этом формате

jaggers 28.05.2019 18:05

также будет ли фактическая система проверки работать с кодом, написанным в исходном вопросе?

jaggers 28.05.2019 18:08

Всегда есть несколько способов сделать что-то подобное. Я предлагаю прочитать файл в том же формате, в котором вы его записываете, и продолжать использовать для этого модуль json. По-видимому, это учебное упражнение для вас? В этом случае я оставлю вам возможность просмотреть документацию.

CodeRedacted 28.05.2019 18:19
Ответ принят как подходящий

Почему бы просто не использовать простой файл json?

with open("file.txt", "r") as infile:
    database = json.loads(infile.read())

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