Я получаю эту ошибку «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 ключа/значения, текстовый файл не может быть распакован.
Вот что сейчас находится в текстовом файле, что вызывает ошибку: {"name" : "hello", "man" : "mane"}
Используя функцию 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"}
Попробуй это,
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, вы упомянули пример текстовой строки, присутствующей в файле в комментариях к вопросу. Я использовал то же самое для создания программы. Что такое текст в вашем текстовом файле?
содержимое текстового файла: {"name" : "hello", "man" : "mane"} однако мне нужно, чтобы код работал независимо от того, что находится в текстовом файле, так как это может быть изменено пользователями. изменить свои данные, пользователи могут удалить свою учетную запись или новые пользователи могут быть добавлены в словарь
@jaggers Независимо от того, удаляются или добавляются данные. Свойство словаря - ключи должны быть уникальными. значения могут быть обновлены. Если вам нужно поддерживать словарь пользователей, я могу вам предложить создать id's
как ключи и поддерживать словарь как значение этого ключа.
Это будет полностью выходить за рамки этого вопроса. users_dict = {'1':{'name':'hello1', 'man':'mane1'}, '2':{'name':'hello2', 'man':'mane2'}
. Вы можете рассматривать это как что-то похожее на пример, как я сказал.
Проверьте все строки в файле файл.txt. Может быть случай, когда вхождение ":" более одного. Так как вы распаковываете список в две переменные. Если в результирующем списке в строке 4 содержится более двух значений, то есть line.strip().split(":"), будет возбуждено исключение.
содержимое файла: {"имя" : "привет", "мужчина" : "грива"}
Содержимое файла выглядит как данные JSON. Вы можете использовать функцию load() модуля json для загрузки данных в виде словаря. Также убедитесь, что ключи в файле уникальны.
будет ли это просто загрузка (file.txt)
Для функции load() требуется файловый объект для чтения. Вы можете обратиться к этому документу realpython.com/python-json для получения дополнительной информации.
Ваш код открывает файл, а затем перебирает его построчно. Если это именно так, как вы говорите в своем комментарии к исходному вопросу, то первый линия:
{"name" : "hello", "man" : "mane"}
Это не может быть проанализировано в вашем коде.
Если ваш файл был вместо этой формы:
"name":"hello"
"man":"mane"
(новая строка неявна), тогда все будет работать нормально.
Ошибка, по-видимому, заключается в том, что вы думаете, что текстовый файл, который выглядит как словарь Python, будет автоматически проанализирован Python как словарь: это не так, поэтому у вас есть другие ответы, которые предлагают использовать eval() или похоже на разбор его для вас.
Возможно, вы захотите использовать модуль json для чтения и записи файлов, похожих на словари.
чт
о, я понимаю, что вы имеете в виду. Знаете ли вы, как заставить код создавать текст в файле в этом формате
также будет ли фактическая система проверки работать с кодом, написанным в исходном вопросе?
Всегда есть несколько способов сделать что-то подобное. Я предлагаю прочитать файл в том же формате, в котором вы его записываете, и продолжать использовать для этого модуль json. По-видимому, это учебное упражнение для вас? В этом случае я оставлю вам возможность просмотреть документацию.
Почему бы просто не использовать простой файл json?
with open("file.txt", "r") as infile:
database = json.loads(infile.read())
Можете ли вы привести пример строки из «file.txt»?