'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 шт):

Автор решения: CrazyElf
  data = '' # <-- СТРОКА!

  while (not data.isdigit()):
      data = {"ID": input('Введите ID: ')} # <-- СЛОВАРЬ!!!

Просто не нужно разные переменные называть одинаковыми именами. У вас переменная data - это и строка, которую вы проверяете на isdigit, и словарь, содержащий ключ ID. Разделите эти сущности на две отдельные переменные - и не будет никаких проблем.

Ну, либо можете сразу сделать словарь и проверять его поле:

  data = {"ID": ''}

  while (not data["ID"].isdigit()):
      data = {"ID": input('Введите ID: ')}
→ Ссылка
Автор решения: Dmitry

Первое - это ошибка с работой с типом данных словарь. Ключ - это по сути уникальное значение. Поэтому запускать 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 необходимо указать цифрами!')

Помогло.

→ Ссылка