读取时间表文本文件,如何优雅计算课程间的空闲时长?
嘿,这个需求我之前帮人处理过类似的,核心思路其实很清晰:先把所有课程时间解析成计算机能识别的时间对象,按顺序排好,再逐个计算相邻课程的间隔。下面给你拆解成具体可落地的步骤,保证优雅又实用:
第一步:从文本中提取并解析课程时间
首先得把txt里符合Ddd hh:mm-hh:mm格式的字符串捞出来,用正则表达式是最高效的方式。然后把每个字符串拆成「星期几」「开始时间」「结束时间」,再转换成可计算的时间对象(用Python标准库datetime就足够,不用额外装包)。
举个可直接运行的Python示例:
import re from datetime import datetime, timedelta # 正则匹配规则:匹配3字母星期 + 开始-结束时间(兼容单/双位数小时) time_pattern = r'(\w{3}) (\d{1,2}:\d{2})-(\d{1,2}:\d{2})' # 读取文件并提取所有课程条目 course_list = [] with open('你的时间表文件.txt', 'r', encoding='utf-8') as f: for line in f: # 一行可能有多个课程,所以用findall matches = re.findall(time_pattern, line.strip()) for match in matches: day_abbr, start_str, end_str = match # 把星期缩写转成数字(周一=0,周日=6,可根据你的习惯调整) day_mapping = {'Mon':0, 'Tue':1, 'Wed':2, 'Thu':3, 'Fri':4, 'Sat':5, 'Sun':6} day_num = day_mapping[day_abbr.capitalize()] # 兼容大小写 # 用一个虚拟基准日期,把星期和时间拼接成完整datetime对象 base_date = datetime(2024, 1, 1) # 随便选一个已知星期的日期,这里是周一 # 调整到目标星期几 target_date = base_date + timedelta(days=day_num - base_date.weekday()) # 解析开始/结束时间,替换到目标日期上 start_dt = datetime.strptime(start_str, '%H:%M').replace( year=target_date.year, month=target_date.month, day=target_date.day ) end_dt = datetime.strptime(end_str, '%H:%M').replace( year=target_date.year, month=target_date.month, day=target_date.day ) course_list.append({ 'day': day_abbr, 'start': start_dt, 'end': end_dt })
第二步:按时间顺序排序课程
要计算间隔,必须先把课程按「星期几+开始时间」排序,不然跨天跨星期的间隔会算错:
# 排序逻辑:先按星期几的数字,再按当天的开始时间 course_list.sort(key=lambda x: (x['start'].weekday(), x['start']))
第三步:计算相邻课程的休息时长
遍历排序后的列表,逐个计算前一节课结束到后一节课开始的时间差,还能处理跨星期的特殊情况:
for idx in range(1, len(course_list)): prev_course = course_list[idx-1] curr_course = course_list[idx] # 计算时间差 break_delta = curr_course['start'] - prev_course['end'] # 处理跨星期的情况(比如周日晚的课到周一早) if break_delta.total_seconds() < 0: break_delta += timedelta(days=7) # 转换成小时输出,也可以转成分钟 break_hours = break_delta.total_seconds() / 3600 print(f"👉 从{prev_course['day']} {prev_course['end'].strftime('%H:%M')}到{curr_course['day']} {curr_course['start'].strftime('%H:%M')},休息时长:{break_hours:.1f}小时")
像你举的例子:周五12:00-15:00和周五17:00-19:00,这段代码会算出刚好2小时的休息时间,完全符合预期。
第四步:生成时间表&实时空闲提醒
如果要做一个能提醒「距离下节课还有多久」的功能,只需要对比当前时间和排序后的课程:
now = datetime.now() # 找到第一个开始时间在当前时间之后的课程 next_course = None for course in course_list: if course['start'] > now: next_course = course break if next_course: time_left = next_course['start'] - now hours_left = time_left.total_seconds() / 3600 print(f"\n⏰ 距离下一节课({next_course['day']} {next_course['start'].strftime('%H:%M')})还有{hours_left:.1f}小时") else: print("\n🎉 本周没有后续课程啦,好好休息!")
一些小优化建议
- 如果课程是每周循环的,用
python-dateutil库的rrule可以更方便地处理重复事件,不用每次都解析星期几 - 可以把解析后的课程转成
pandasDataFrame,轻松生成可视化的表格时间表 - 正则表达式可以根据实际文本调整,比如有些文本可能用全称星期(比如Friday而不是Fri),可以把
\w{3}改成\w{3,9}来兼容
内容的提问来源于stack exchange,提问作者Mark Kalydy
相关产品推荐
相关产品推荐

