Python日期解析实验BUG排查:EOF错误与日期格式处理问题
解决Zybooks Python 33.15《解析日期》实验的两个问题
问题概述
- 实验需求:读取符合
March 1, 1990格式的日期,转换为3/1/1990格式输出;不符合格式的忽略;输入以单独一行的-1结束。 - 当前代码存在两个核心问题:
- 循环读取输入时触发
EOFError - 无法去除日期日部分的逗号,导致输出错误格式(如
3/1,/1990)
- 循环读取输入时触发
问题分析与修复方案
1. 修复EOFError问题
EOFError通常因input()读取时输入流提前终止导致(比如测试时未输入-1就结束输入)。解决方式是在循环中主动判断终止条件,同时捕获EOF异常做兜底处理。
2. 修复逗号未去除问题
日期中的逗号跟随在日数字后(如1,),可通过字符串替换或拆分后清理的方式去除,确保日部分为纯数字。
修复后的完整代码
# 月份名称到数字的映射字典 month_map = { 'January': '1', 'February': '2', 'March': '3', 'April': '4', 'May': '5', 'June': '6', 'July': '7', 'August': '8', 'September': '9', 'October': '10', 'November': '11', 'December': '12' } while True: try: line = input().strip() # 检测终止输入条件 if line == '-1': break # 拆分日期各部分 parts = line.split() # 验证格式合法性:必须拆分为3个部分 if len(parts) != 3: continue month_name, day_part, year = parts # 去除日部分的逗号 day = day_part.replace(',', '') # 验证月份是否合法、日和年是否为数字 if month_name not in month_map or not day.isdigit() or not year.isdigit(): continue # 输出转换后的日期格式 print(f"{month_map[month_name]}/{day}/{year}") except EOFError: # 捕获输入流异常,终止循环 break
代码关键说明
- 月份映射:用字典实现月份名称到数字的快速转换,避免冗余判断。
- 输入容错:通过
try-except捕获EOFError,防止输入异常导致程序崩溃;每次读取后优先判断是否为终止符-1。 - 格式校验:检查拆分后的部分数量、月份合法性、日和年的数字属性,不符合条件的输入直接跳过。
- 逗号清理:使用
replace(',', '')直接移除日部分的逗号,保证输出格式正确。
测试示例
测试输入
March 1, 1990 April 15, 2023 Invalid date format -1
输出结果
3/1/1990 4/15/2023
内容的提问来源于stack exchange,提问作者Michele Ray
相关产品推荐
相关产品推荐

