Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何提示输入直到日期格式和时间格式正确?_Python_Try Except - Fatal编程技术网

Python 如何提示输入直到日期格式和时间格式正确?

Python 如何提示输入直到日期格式和时间格式正确?,python,try-except,Python,Try Except,我正在做一个活动计划,我想用时间提示开始日期,用时间提示结束日期。验证工作一直持续到开始日期和开始时间,但问题在结束日期和时间出现。 当结束日期格式不正确时,它不会再次提示结束日期,而是再次提示开始时间,结束时间也是如此 import datetime as dt date_format = "%d-%m-%Y" time_format = "%H:%M" start_date = input("Please enter start date:

我正在做一个活动计划,我想用时间提示开始日期,用时间提示结束日期。验证工作一直持续到开始日期和开始时间,但问题在结束日期和时间出现。 当结束日期格式不正确时,它不会再次提示结束日期,而是再次提示开始时间,结束时间也是如此

import datetime as dt

date_format = "%d-%m-%Y"
time_format = "%H:%M"
start_date = input("Please enter start date: ")
while True:
     try:
          dt.datetime.strptime(start_date, date_format)
          start_time = input("Please enter start time: ")
          try:
               dt.datetime.strptime(start_time, time_format)
               end_date = input("Please enter end date: ")
               try:
                    dt.datetime.strptime(end_date, date_format)
                    end_time = input("Please enter end time: ")
                    try:
                         dt.datetime.strptime(end_time, time_format)
                         print(start_date,start_time)
                         print(end_date,end_time)
                    except:
                         print("This is the incorrect time string format. It should be HH:MM")
               except:
                    print("This is the incorrect date string format. It should be DD-MM-YYYY")
          except:
               print("This is the incorrect time string format. It should be HH:MM")          
     except:
          print("This is the incorrect time string format. It should be DD-MM-YYYY")
          start_date = input("Please enter start date: ")

对每个提示使用
while loop

将日期时间导入为dt
日期格式=“%d-%m-%Y”
时间\格式=“%H:%M”
尽管如此:
开始日期=输入(“请输入开始日期:”)
尝试:
dt.datetime.strtime(开始日期,日期格式)
打破
除:
持续
尽管如此:
开始时间=输入(“请输入开始时间:”)
尝试:
dt.datetime.strtime(开始时间,时间格式)
打破
除:
持续
尽管如此:
结束日期=输入(“请输入结束日期:”)
尝试:
dt.datetime.strtime(结束日期,日期格式)
打破
除:
持续
尽管如此:
结束时间=输入(“请输入结束时间:”)
尝试:
dt.datetime.strtime(结束时间,时间格式)
打破
除:
持续
打印(开始日期、开始时间)
打印(结束日期、结束时间)

对每个提示使用
while loop

将日期时间导入为dt
日期格式=“%d-%m-%Y”
时间\格式=“%H:%M”
尽管如此:
开始日期=输入(“请输入开始日期:”)
尝试:
dt.datetime.strtime(开始日期,日期格式)
打破
除:
持续
尽管如此:
开始时间=输入(“请输入开始时间:”)
尝试:
dt.datetime.strtime(开始时间,时间格式)
打破
除:
持续
尽管如此:
结束日期=输入(“请输入结束日期:”)
尝试:
dt.datetime.strtime(结束日期,日期格式)
打破
除:
持续
尽管如此:
结束时间=输入(“请输入结束时间:”)
尝试:
dt.datetime.strtime(结束时间,时间格式)
打破
除:
持续
打印(开始日期、开始时间)
打印(结束日期、结束时间)

如果在执行过程中发生错误,则所有操作都会在while true之后重新启动,即在开始时间

考虑使用一个简单的状态机:

def prompt_start_time():
  #get input, do something and validate format
  if input_validated: 
     next_state = "prompt_date"
     return start_time, next_state
   else:
     return None, "prompt_start_time"

def prompt_date():
  #do something and return prompt date
  if input_validated: 
     next_state = "end_date"
  else:
     next_state = "prompt_date"
  return start_date, next_state

def end_date():
  #...

state_machine = {"prompt_start_time": prompt__start_time, "prompt_date":prompt_date, "end_date": end_date}

while True:
  value, state = state_machine[current_state]()
  current_state = state

如果在执行过程中发生错误,则所有操作都会在while true之后重新启动,即在开始时间

考虑使用一个简单的状态机:

def prompt_start_time():
  #get input, do something and validate format
  if input_validated: 
     next_state = "prompt_date"
     return start_time, next_state
   else:
     return None, "prompt_start_time"

def prompt_date():
  #do something and return prompt date
  if input_validated: 
     next_state = "end_date"
  else:
     next_state = "prompt_date"
  return start_date, next_state

def end_date():
  #...

state_machine = {"prompt_start_time": prompt__start_time, "prompt_date":prompt_date, "end_date": end_date}

while True:
  value, state = state_machine[current_state]()
  current_state = state

下面是一个干净的、类似于蟒蛇的方法:

import datetime as dt

date_format = "%d-%m-%Y"
time_format = "%H:%M"

def get_date(date_format, input_message):

    date = None

    while True:
        try:
            date = input(input_message)
            dt.datetime.strptime(date, date_format)
        except:
            print("This is the incorrect date string format. It should be DD-MM-YYYY")
            # Error! Return to the start of the loop
            continue
        else:
            # Success! Exit loop
            break

    return date


def get_time(time_format, input_message):

    time = None

    while True:
        try:
            time = input(input_message)
            dt.datetime.strptime(time, time_format)
            
        except:
            print("This is the incorrect time string format. It should be HH:MM")
            # Error! Return to the start of the loop
            continue
        else:
            # Success! Exit loop
            break

    return time


start_date = get_date(date_format, "Please enter start date: ")
start_time = get_time(time_format, "Please enter start time: ")
end_date = get_date(date_format, "Please enter end date: ")
end_time = get_time(time_format, "Please enter end time: ")
  • 我们创建了两个函数:一个用于日期输入,另一个用于时间输入
  • 然后,我们通过更改作为参数传递的tyhe inpu mùmessage来调用这些函数
  • 输入验证逻辑包含在2个函数中,因此代码维护将更容易

    说明如何进行输入验证: 这里我们使用try/except/else:

    • 如果
      try
      子句引发异常,它将执行
      except

    • 如果
      try
      子句没有引发异常,它将在
      else

    • If in except:我们在这里是因为输入错误,所以我们打印一条消息,并使用
      continue
      ,以便直接在循环开始时执行
      中的代码,然后重试

    • 如果我们处于
      else
      :输入正常,因此我们使用
      break
      来离开while循环


    这里有一个干净的、类似于蟒蛇的方法:

    import datetime as dt
    
    date_format = "%d-%m-%Y"
    time_format = "%H:%M"
    
    def get_date(date_format, input_message):
    
        date = None
    
        while True:
            try:
                date = input(input_message)
                dt.datetime.strptime(date, date_format)
            except:
                print("This is the incorrect date string format. It should be DD-MM-YYYY")
                # Error! Return to the start of the loop
                continue
            else:
                # Success! Exit loop
                break
    
        return date
    
    
    def get_time(time_format, input_message):
    
        time = None
    
        while True:
            try:
                time = input(input_message)
                dt.datetime.strptime(time, time_format)
                
            except:
                print("This is the incorrect time string format. It should be HH:MM")
                # Error! Return to the start of the loop
                continue
            else:
                # Success! Exit loop
                break
    
        return time
    
    
    start_date = get_date(date_format, "Please enter start date: ")
    start_time = get_time(time_format, "Please enter start time: ")
    end_date = get_date(date_format, "Please enter end date: ")
    end_time = get_time(time_format, "Please enter end time: ")
    
  • 我们创建了两个函数:一个用于日期输入,另一个用于时间输入
  • 然后,我们通过更改作为参数传递的tyhe inpu mùmessage来调用这些函数
  • 输入验证逻辑包含在2个函数中,因此代码维护将更容易

    说明如何进行输入验证: 这里我们使用try/except/else:

    • 如果
      try
      子句引发异常,它将执行
      except

    • 如果
      try
      子句没有引发异常,它将在
      else

    • If in except:我们在这里是因为输入错误,所以我们打印一条消息,并使用
      continue
      ,以便直接在循环开始时执行
      中的代码,然后重试

    • 如果我们处于
      else
      :输入正常,因此我们使用
      break
      来离开while循环


    非常好,非常清晰,谢谢!非常好,非常清楚,谢谢!谢谢你的创意银行的创意