读取txt文件中任务截止日期并与当前日期校验判断是否逾期
问题:统计tasks.txt中的逾期任务数量
我是编程初学者,若问题简单还请见谅,感谢您的帮助。我需要读取tasks.txt文件中的任务截止日期(对应格式里的第4个字段,split后索引为3),并与当前日期对比判断任务是否逾期。
tasks.txt文件内容
格式说明:任务分配用户;任务内容;任务描述;截止日期;添加日期;是否完成
sam;needs doing;now;2004-04-12;2024-03-05;No sam;please do;gym;2024-05-20;2024-03-05;No admin;do;sd;2004-12-12;2024-03-05;No dam;dam;dam;2024-12-12;2024-03-05;No
现有代码
elif menu == 'gr': # creating dictionary with values for task_overview file stat_dict_task_overview = { "Tasks": 0, "Completed": 0, "Uncompleted": 0, "Overdue": 0, "Percentage Incomplete": 0, "Percentage Overdue": 0 } # creating dictionary with values for user_overview file stat_dict_user_overview = { "Users": 0, "Tasks": 0, "Name": 0, } # open tasks.txt as read tasks = open("tasks.txt", "r") # Split contents task.txt by ';' for count, line in enumerate(tasks): split_by_semi = line.split(';') # unpack elements in task.txt into corresponding variables user = split_by_semi[0] how_many_tasks = split_by_semi[1] description_task = split_by_semi[2] due_date = split_by_semi[3] date_added = split_by_semi[4] completed = split_by_semi[5] # Add 1 to "Tasks" for each line stat_dict_task_overview["Tasks"] += count + 1 # Add 1 to "Completed if "Yes" if[5] == "Yes": stat_dict_task_overview["Completed"] += count + 1 # Else add 1 to "Uncompleted" else: stat_dict_task_overview["Uncompleted"] += count + 1 # Code stuck on needs to check todays date against due date and add 1 if overdue if[3] < datetime.today().date(): stat_dict_task_overview["Overdue"] += count + 1 # Print results for my ongoing review print(stat_dict_task_overview)
问题卡点
目前卡在截止日期与当前日期的校验部分,无法正确统计逾期任务数量。
解决方案
你的代码存在几个核心问题:
- 统计逻辑都写在循环外部,导致仅处理了最后一行任务数据
- 直接用字符串格式的日期和
date对象对比,类型不匹配无法正确判断 - 存在语法错误(
if[5]写法不合法),且未区分已完成/未完成任务的逾期判断逻辑
以下是修正后的完整代码:
from datetime import datetime # 必须导入datetime模块 elif menu == 'gr': stat_dict_task_overview = { "Tasks": 0, "Completed": 0, "Uncompleted": 0, "Overdue": 0, "Percentage Incomplete": 0, "Percentage Overdue": 0 } stat_dict_user_overview = { "Users": 0, "Tasks": 0, "Name": 0, } # 用with语句自动管理文件关闭,避免资源泄漏 with open("tasks.txt", "r") as tasks: for line in tasks: line = line.strip() if not line: # 跳过空行 continue split_by_semi = line.split(';') user = split_by_semi[0] task_content = split_by_semi[1] task_desc = split_by_semi[2] due_date_str = split_by_semi[3] date_added_str = split_by_semi[4] completed = split_by_semi[5].strip() # 去除字段多余空格 # 统计总任务数 stat_dict_task_overview["Tasks"] += 1 # 统计完成/未完成任务 if completed == "Yes": stat_dict_task_overview["Completed"] += 1 else: stat_dict_task_overview["Uncompleted"] += 1 # 仅未完成任务需要判断逾期 due_date = datetime.strptime(due_date_str, "%Y-%m-%d").date() today = datetime.today().date() if due_date < today: stat_dict_task_overview["Overdue"] += 1 # 计算百分比,避免总任务数为0时除以0报错 total_tasks = stat_dict_task_overview["Tasks"] if total_tasks > 0: stat_dict_task_overview["Percentage Incomplete"] = round((stat_dict_task_overview["Uncompleted"] / total_tasks) * 100, 2) stat_dict_task_overview["Percentage Overdue"] = round((stat_dict_task_overview["Overdue"] / total_tasks) * 100, 2) print(stat_dict_task_overview)
关键修正说明:
- 统计逻辑移至循环内部:每读取一条任务就完成一次统计,确保所有任务都被处理
- 日期类型转换:用
datetime.strptime()将字符串日期转为date对象,才能和当前日期做比较 - 逾期判断规则:只有未完成的任务才计入逾期统计,符合实际业务逻辑
- 文件管理优化:使用
with语句自动关闭文件,代码更安全 - 空白处理:用
strip()清理字段多余空格,避免判断出错 - 百分比计算:补全字典中百分比字段的逻辑,同时处理了总任务数为0的边界情况
内容的提问来源于stack exchange,提问作者SamWestlake-Cann
相关产品推荐
相关产品推荐

