在Python中循环浏览输入

时间:2019-03-22 07:47:41

标签: python loops

我有一个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 :(得分:0)

条件在range(len(Ui))之上,它是循环中的当前索引(因为您在i上进行了迭代),例如,它的取值范围为0、1、2,依此类推。

我猜您希望for i in Ui:是用户引入的当前值。如果是这样,则循环应改为i == "2"。但是请注意,该值不是字符串而是整数(即使输入看起来像是整数)也不是整数。因此,比较应该为int(i) == 2(或int,但是如果用户输入的内容无法通过sudo docker run --name=test1 -v ~/testfile:/var/lib/docker -p 4000:80 woonx/dockertester1 进行转换,则这不是错误的)。

答案 1 :(得分:0)

循环中的变量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)))

答案 2 :(得分:0)

首先,关于第二个拆分代码,您可能错过了类型转换。

在Python中, private static List<String> getDifference(Object s1, Object s2) throws IllegalAccessException { List<String> values = new ArrayList<>(); for (Field field : s1.getClass().getDeclaredFields()) { field.setAccessible(true); Object value1 = field.get(s1); Object value2 = field.get(s2); if (value1 != null && value2 != null) { if (!Objects.equals(value1, value2)) { values.add(String.valueOf(field.getName()+": "+value1+" -> "+value2)); } } } return values; } 将返回2 == '2'

因此,要使代码的第二部分正常工作,这将有所帮助:

False

此外,现在,您的订单ID似乎为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类型转换。因为您的订单ID始终为int

因此,对于输入多个订单ID,这可能会有所帮助(此外,即使我自己说这是一个完整的话题,我也可以随意添加所需的ESC键出口):

String

要使用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