Python日期格式化代码多余空格问题排查与修复求助
日期格式化代码的空格问题排查
我写了一段Python日期格式化代码,功能是将两种格式的日期(MM/DD/YYYY和Month DD, YYYY)转换为YYYY-MM-DD格式:
mon = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] while True : ask_date = input ('Date:') try: month,day,year= ask_date.split('/') if int(month) >=1 and int(month) <=12 and int(day)>=1 and int(day) <= 31 : break except : try : old_month,old_day,year=ask_date.split(' ') for i in range(len(mon)): if old_month == mon[i]: month =i+1 day = old_day.replace(',',' ') if (",") not in old_day : pass elif int(month) >=1 and int(month) <=12 and int(day)>=1 and int(day) <= 31 : break except : print() pass print(f"{year}-{int(month):02}-{int(day):02}",sep='',end='')
测试时发现,手动输入9/8/1636能得到预期的1636-09-08,但用CS50扩展测试带前后空格的输入(比如" 9/8/1636 ")时,输出变成了1636 -09-08,多了多余的空格,不符合预期。测试案例详情如下:
:) outdated.py exists :) input of 9/8/1636 outputs 1636-09-08 :) input of September 8, 1636 outputs 1636-09-08 :) input of 10/9/1701 outputs 1701-10-09 :) input of October 9, 1701 outputs 1701-10-09 ---> :( input of " 9/8/1636 " outputs 1636-09-08 expected "1636-09-08", not "1636 -09-08" :) input of 23/6/1912 results in reprompt :) input of 10 December, 1815 results in reprompt :) input of October/9/1701 results in reprompt :) input of 1/50/2000 results in reprompt :) input of December 80, 1980 results in reprompt :) input of September 8 1636 results in reprompt
问题原因
- 输入未去除前后空格:当输入带前后空格时,
ask_date.split('/')会得到包含空格的元素,比如" 9/8/1636 "分割后是[' 9', '8', '1636 '],year变量会保留末尾的空格,最终输出时就会出现1636 -09-08的情况。 - 英文日期处理时的逗号替换错误:代码中用
old_day.replace(',',' ')把逗号换成了空格,比如"8,"会变成"8 ",虽然转成整数不影响,但如果输入本身带空格,可能会引发其他问题。 - 英文日期分割逻辑脆弱:用
split(' ')分割只能处理单个空格的情况,若输入有多个连续空格(比如September 8, 1636),会得到空字符串元素,导致后续报错。
修复方案
- 读取输入后立即去除前后空格:将
ask_date = input('Date:')改为ask_date = input('Date:').strip()。 - 处理英文日期时,将逗号替换为空字符串而非空格:把
day = old_day.replace(',',' ')改为day = old_day.replace(',', '')。 - 改用默认的
split()分割英文日期:默认split()会分割任意数量的空白字符,避免多空格引发的错误。
修改后的代码
mon = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] while True : ask_date = input('Date:').strip() # 去除前后空格 try: month, day, year = ask_date.split('/') if 1 <= int(month) <= 12 and 1 <= int(day) <= 31: break except: try: # 用默认split处理任意数量空白字符 parts = ask_date.split() if len(parts) != 3: raise ValueError old_month, old_day, year = parts # 查找对应月份数字 month = None for idx, m in enumerate(mon): if m == old_month: month = idx + 1 break if not month: raise ValueError # 移除逗号 day = old_day.replace(',', '') if 1 <= month <= 12 and 1 <= int(day) <= 31: break except: pass print(f"{year}-{int(month):02}-{int(day):02}")
内容的提问来源于stack exchange,提问作者xenon oxide
相关产品推荐
相关产品推荐

