Цикл по входам в Python - PullRequest
       5

Цикл по входам в Python

0 голосов
/ 22 марта 2019

У меня есть скрипт на python, где мы получаем данные от пользователя USER (в окне команд нет необходимости в окне GUI на этом этапе). как только пользователь вводит данные, предоставленные данные должны быть проверены, и, если они введены в неправильном формате, их необходимо запрашивать снова и снова, пока они не будут правильными. Часть скрипта, где вводится и проверяется пользовательский ввод, приведена ниже и работает абсолютно нормально.

SOname = '1'  #something that doesn't validate
while True:
    SOname = input("Please enter the order number: ").upper()
    if not re.match(r"\b[A-Z]{2}[-][0-9]{6}\b", SOname):
        print ("Error! Please enter order in format 'AS-XXXXXX'"
    else:
        break

После выполнения этого условия номер заказа используется в дальнейшем для выполнения множества операций. Тем не менее, завершение остальной части программы занимает 2 минуты (это требует большого количества копий файлов, чтения PDF и т. Д.), И я не хочу, чтобы пользователь продолжал ждать завершения программы и снова начал вводить другой номер заказа .

Итак, я хочу предоставить возможность ввода нескольких номеров заказов, разделенных пробелами (например: они могут вводить 5 номеров заказов и работать над чем-то другим, пока программа python работает в течение 10-12 минут). И так же, как для одного номера заказа, каждая из записей должна быть проверена по вышеупомянутым критериям, и каждый номер должен пройти через остальную часть программы.

Здесь я терплю неудачу. Я написал небольшую программу, чтобы проверить, все ли элементы проходят через цикл, и это не так, и я не могу понять, почему.

user_input = input("Enter Numbers:")
Ui = user_input.split()
for i in range(len(Ui)):
    if i == 2:
        print(i)
    else:
        print ("tada")

Если ввести значения "2 4 2 4 2 4", я получу вывод " тада тада 2 тада тада тада "

это даже не имеет смысла для меня. он печатает 2 раза, но на входе есть 3 2. Что я делаю неправильно? Как сделать ввод, чтобы пройти проверку, а затем через остальную часть программы. А также, в случае, когда пользователь запустил программу, но не хочет вводить , как завершить сценарий, нажав клавишу Esc ?? Я смотрел во многих местах, но у меня ничего не работает.

Ответы [ 3 ]

0 голосов
/ 22 марта 2019

Переменная i в цикле принимает не значение данных, а индекс этих данных. Поэтому в первый раз через него будет значение 0, в следующий раз - 1 и т. Д. Таким образом, вы всегда будете печатать «2» в качестве второго элемента, независимо от того, каков ваш фактический ввод.

Если вы хотите перебрать значения в вашем списке, попробуйте:

for i in Ui:
   if int(i) == 2:
       print(i)

int() есть, потому что ввод будет строкой ввода, а не целым числом.

Более полный пример использования вашей проверки регулярного выражения будет выглядеть так:

import re

while True:
    user_input = input("Enter Numbers:")
    Ui = user_input.split()
    for order in Ui:
        if not re.match(r"\b[A-Z]{2}[-][0-9]{6}\b", order):
            print ("Error! Please enter order in format 'AS-XXXXXX', not {}".format(order))
            break
    else:
        break

print("Orders are {}".format(", ".join(Ui)))
0 голосов
/ 22 марта 2019

Во-первых, что касается второго кода разделения, вы, вероятно, пропустили преобразование типов.

В Python 2 == '2' вернет False.

Итак, чтобы вторая часть вашего кода работала, это поможет:

user_input = input("Enter Numbers:")
Ui = user_input.split()
for i in range(len(Ui)):
    if int(i) == 2:
        print(i)
    else:
        print ("tada")

Более того, идентификаторы вашего заказа, похоже, имеют формат AS-XXXXXX. В этом случае вам не придется выполнять приведение типа int. Потому что ваши идентификаторы заказов в любом случае будут String.

Так что для ввода нескольких идентификаторов заказов это может помочь (также я позволил себе добавить ключ выхода ESC, который вы хотели, хотя я бы сказал, что это целая тема сама по себе):

import keyboard    
while True:
    if keyboard.is_pressed('ESC'):
        break
    else:
        SOname = input("Please enter the order number:  (If multiple, seperate by spaces)").upper()
        if(SOname == 
        IDArray = SOname.split()
        for ID in IDArray:
            if not re.match(r"\b[A-Z]{2}[-][0-9]{6}\b", ID):
            print ("Error in ", ID, " Please enter order in format 'AS-XXXXXX'")
        else:
            break

Для использования keyboard может потребоваться pip install keyboard в вашей оболочке.

0 голосов
/ 22 марта 2019

Условие превышает i, что является текущим индексом в цикле (поскольку вы итерировали на range(len(Ui))), например, он принимает значения от 0, 1, 2 и т. Д.

Полагаю, вы ожидали, что i будет текущим значением, введенным пользователем. Если это так, тогда цикл должен быть for i in Ui:. Однако обратите внимание, что это значение является строкой, а не целым числом (даже если входные данные выглядят как целое число). Таким образом, сравнение должно быть i == "2" (или int(i) == 2, но это не является ошибкой, если пользователь вводит что-то, что не может быть преобразовано с помощью int).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...