'dict' object has no attribute 'isdigit'
Есть такой вот скрипт
import json
import re
while True:
print("1. Добавить новую запись")
print("2. Поиск по записям")
print("0. выйти из программы")
cmd = input("Выберите пункт: ")
if cmd == "1":
print ("Ввод данных")
data = ''
while (not data.isdigit()):
data = {"ID": input('Введите ID: ')}
print()
if (not data.isdigit()):
print('ID необходимо указать цифрами!')
else:
print("")
data = int(data)
print ("Введите ФИО")
data["Name"] = input()
print ("Введите email")
data["Email"] = input()
print ("Введите номер телефона")
data["Phone"] = input()
with open("users.json", "a+") as file:
file.write('\n')
json.dump(data, file,ensure_ascii=False )
elif cmd == "2":
print ("Введите данные для поиска")
w = input()
with open("Users.json") as fin:
for s in fin.readlines():
if s.find(w) > -1:
print(s.strip())
elif cmd == "0":
break
Скрипт смотрит есть ли файл в директории, если нет создает, если есть дописывает. Так же поиск по уже имеющимся данным. Не получается сделать, что бы в поле ввода ID был ограничен ввод только числовыми значениями. При этом если вводится не число, выдается предупреждение и возвращаемся к вводу ID заново
if cmd == "1":
print ("Ввод данных")
data = ''
while (not data.isdigit()):
data = {"ID": input('Введите ID: ')}
print()
if (not data.isdigit()):
print('ID необходимо указать цифрами!')
else:
print("")
data = int(data)
Вот на это участке вываливается ошибка
Traceback (most recent call last):
File "C:\Users\nkovalev\Desktop\Read-WriteReady.v0.3.1.py", line 24, in <module>
if (not data.isdigit()):
AttributeError: 'dict' object has no attribute 'isdigit'
Я так понимаю ругается на то, что словари не могут работать с модулем isdigit. Собственно вопрос - каким способом их можно подружить? Так же буду очень благодарен если подскажите литературу для новичков, ибо python первый язык и это первый скрипт на нем, ранее подобным не занимался.
Ответы (3 шт):
data = '' # <-- СТРОКА!
while (not data.isdigit()):
data = {"ID": input('Введите ID: ')} # <-- СЛОВАРЬ!!!
Просто не нужно разные переменные называть одинаковыми именами. У вас переменная data - это и строка, которую вы проверяете на isdigit, и словарь, содержащий ключ ID. Разделите эти сущности на две отдельные переменные - и не будет никаких проблем.
Ну, либо можете сразу сделать словарь и проверять его поле:
data = {"ID": ''}
while (not data["ID"].isdigit()):
data = {"ID": input('Введите ID: ')}
Первое - это ошибка с работой с типом данных словарь. Ключ - это по сути уникальное значение. Поэтому запускать while на один и тот же ключ, все-таки, является ошибкой. Но если уж очень хочется переписывать значение по ключу в цикле while, то можно что-то такое написать
>>> data = {}
>>> while True:
... id = input('Введите ID: ')
... try:
... id_int = int(id)
... data["ID"] = id_int
... except:
... print("Input has to be integer")
... break
...
Введите ID: 10
Введите ID: 20
Введите ID: 30
Введите ID: test
Input has to be integer
>>> data
{'ID': 30}
>>>
то есть ошибка в логике будет то, что сохраняется только последнее введенное значение
Большое спасибо. Решение
while (not data["ID"].isdigit()):
data = {"ID": input('Введите ID: ')}
if (not data["ID"].isdigit()):
print('ID необходимо указать цифрами!')
Помогло.