Python函数内日期输入验证问题:错误输入无法重新问询
解决CSV员工信息追加时的日期输入循环验证问题
你的代码目前能检测日期格式错误,但错误输入依然会被写入CSV,而且不会重新提示用户输入正确内容。核心问题是没有循环获取输入直到验证通过,且验证逻辑和主流程的耦合方式不对。下面是修改后的完整代码,以及关键改动说明:
修正后的完整代码
import csv import datetime # 修正表头为字符串列表(原代码里的元素是未定义变量,会报错) header = ['employee_id', 'name', 'address', 'ssn', 'date_of_birth', 'job_title', 'start_date', 'end_date'] def add_employee(): employee_data = [] for field in header: # 针对日期字段循环获取输入,直到格式正确 if 'date' in field: while True: user_input = input(f'Input Employee {field}: ') if validate_date(user_input): employee_data.append(user_input) break print("格式错误,请输入MM/DD/YYYY格式的日期") else: user_input = input(f'Input Employee {field}: ') employee_data.append(user_input) # 追加写入CSV,with语句自动管理文件关闭 with open('employees.csv', 'a', newline="") as f_object: writer = csv.writer(f_object) writer.writerow(employee_data) print("员工信息已成功添加") def validate_date(date_string): date_format = '%m/%d/%Y' try: # 同时验证格式和日期有效性(比如2月30日这类无效日期也会被拦截) datetime.datetime.strptime(date_string, date_format) return True except ValueError: return False
关键改动说明
- 移除全局变量:把日期验证改成接收参数、返回布尔值的独立函数,避免全局变量带来的逻辑混乱
- 循环输入验证:对所有含date的字段使用
while True循环,只有输入符合要求时才跳出循环,确保无效数据不会被加入列表 - 修复表头错误:原表头使用未定义的变量名,改成字符串列表后避免运行时NameError
- 简化文件操作:
with上下文管理器会自动关闭文件,不需要手动调用close() - 强化验证逻辑:
strptime不仅检查格式,还会验证日期的实际有效性(比如4月31日、2月30日这类非法日期也会被拦截)
现在运行程序时,只要用户输入的日期格式不对,就会一直提示重新输入,直到输入正确的MM/DD/YYYY格式日期,才会继续处理下一个字段,最终写入CSV的都是有效数据。
内容的提问来源于stack exchange,提问作者Parker Johnson
相关产品推荐
相关产品推荐

