Python实现txt文件用户任务分组统计的模块化方案咨询
模块化实现方案
核心解决思路是放弃硬编码用户列表的写法,用*字典(键值对结构)*作为动态统计容器,不需要提前预知用户名单,遍历任务数据时遇到新用户就自动初始化对应统计项,从根本上适配新增用户的场景。
核心实现逻辑
- 统一日期格式转换:把txt里字符串格式的到期日转成可比较的日期对象,用于逾期判断
- 动态初始化统计项:以用户名为字典键,值为存储「总任务数/已完成数/逾期数」的统计对象,遍历到未记录的新用户时,自动创建初始值为0的统计条目
- 逐行更新计数:遍历每条任务时,对应用户的统计值累加,不需要提前做用户匹配
- 自动输出结果:遍历完成后字典中自动包含所有用户的完整统计数据,直接写入输出文件即可
修正后完整代码
from datetime import datetime # 日期格式配置,和txt内的格式对应 DUE_DATE_FORMAT = "%d/%b/%Y" if __name__ == "__main__": user_stats = {} total_tasks = 0 today = datetime.today() # 读取任务文件逐行处理 with open('tasks.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue # 拆分任务字段 split_task = [item.strip() for item in line.split(",")] user_name, _, _, due_date_str, _, completed = split_task # 新用户自动初始化统计项 if user_name not in user_stats: user_stats[user_name] = { "total": 0, "completed": 0, "overdue": 0 } # 统计值更新 total_tasks += 1 user_stats[user_name]["total"] += 1 if completed.lower() == "yes": user_stats[user_name]["completed"] += 1 else: # 未完成任务判断是否逾期 due_date = datetime.strptime(due_date_str, DUE_DATE_FORMAT) if due_date < today: user_stats[user_name]["overdue"] += 1 # 写入统计结果 with open('user_overview.txt', 'w', encoding='utf-8') as user_ov: user_ov.write(f"总用户数:{len(user_stats)}\n") user_ov.write(f"总任务数:{total_tasks}\n\n") user_ov.write("=== 各用户任务统计 ===\n") for user, stats in user_stats.items(): user_ov.write(f"\n用户:{user}\n") user_ov.write(f"分配任务总量:{stats['total']}\n") user_ov.write(f"已完成任务数:{stats['completed']}\n") user_ov.write(f"逾期任务数:{stats['overdue']}\n")
原有代码问题说明
- 存在变量名笔误:
split_task_cont为拼写错误,实际拆分后的列表变量为split_task - 循环逻辑混乱:内层循环将
user_name重置为空列表,完全无法实现用户匹配 - 核心变量未定义:
file_content/length_user/length_task均无赋值逻辑,运行会直接报错 - 文件操作未做资源释放:直接用
open()打开文件未手动关闭,容易出现文件占用问题
内容的提问来源于stack exchange,提问作者Tdog
相关产品推荐
相关产品推荐

