我有一个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键结束脚本?我在很多地方抬头望去,但对我没有任何帮助。
答案 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
。